汉诺塔——经典递归问题(c语言实现)

问题背景

汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?

问题分析

思路:
1.使用的语言:C语言
2.使用的编译器:vs2019
3.参考书籍:谭浩强第四版
4.主要使用的知识:函数的递归
5.代码实现的思路主要分为三步:
假设总共需要移动n个盘子
1.将A柱上的n-1个盘子借助C柱移向B柱
2.将A柱上仅剩的最后一个盘子移向C柱
3.将B柱上的n-1个盘子借助A柱移向C柱

代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>void move(int x, int y)
{printf("%c->%c\n", x, y);
}
void hanoi(int n, char a, char b, char c)
{if (n == 1){move(a, c);}else{hanoi(n - 1, a, c, b);//将A座上的n-1个盘子借助C座移向B座move(a, c);//将A座上最后一个盘子移向C座hanoi(n - 1, b, a, c);//将B座上的n-1个盘子借助A座移向C座}
}
//move中的实参与hanoi函数中的形参相对应,而hanoi函数中形参a,b,c所对应的值也是在有规律的变化
int main()
{int n = 0;scanf("%d", &n);hanoi(n, 'A', 'B', 'C');return 0;
}

运行结果

3
A->C
A->B
C->B
A->C
B->A
B->C
A->CD:\c code\小题库\汉诺塔问题\Debug\汉诺塔问题.exe (进程 13928)已退出,代码为 0。
按任意键关闭此窗口. . .
4
A->B
A->C
B->C
A->B
C->A
C->B
A->B
A->C
B->C
B->A
C->A
B->C
A->B
A->C
B->CD:\c code\小题库\汉诺塔问题\Debug\汉诺塔问题.exe (进程 19616)已退出,代码为 0。
按任意键关闭此窗口. . .

代码分析

图解

核心算法

if (n == 1){move(a, c);}
else{hanoi(n - 1, a, c, b);//将A座上的n-1个盘子借助C座移向B座move(a, c);//将A座上最后一个盘子移向C座hanoi(n - 1, b, a, c);//将B座上的n-1个盘子借助A座移向C座}

判断条件为n是否为1,当n=1时结束,再通过move函数将所需步骤打印即可,递归的过程实在不好描述,只能靠自己理解了

个人研究

1.你会发现n个盘子所需的步数为2的n次方减一,并且最中间一步永远为A–>C
2.为什么奇数个盘子时第一步永远为A–>C,而偶数个时,第一步永远为A–>B?
解释:hanoi(n - 1, a, c, b)函数的实参a,b和c并不是总对应A盘,B盘和C盘并且在传递给形参后abc对应的值会发生变化,但是确是有规律的在变化,为什要了解这个呢?因为这个hanoi函数的形参对应的值会影响move函数的打印。规律为形参abc对应值为ACB,ABC循环变化,再加上第一次调用hanoi函数形参abc对应ABC,这也就解释了为什么奇数个盘子时第一步永远为A–>C,而偶数个时,第一步永远为A–>B

体会

好难,看了一下午才理解,也看了书上的解释,看了其他人的解释,上面的分析图就是拷过来的(hhh),只能举几个实例,一遍遍实现代码再一边理解,找出规律。递归问题都好抽象,很难想象出运行结果,可以做一些简单的递归题目加以理解,慢慢来啦,头疼,哈哈哈

如有错误,还请指正,谢谢!

汉诺塔——经典递归问题(c语言实现)相关推荐

  1. 数据结构与算法—递归算法(从阶乘、斐波那契到汉诺塔的递归图解)

    目录 递归介绍 递归求阶乘 递归求斐波那契 递归解决汉诺塔 总结 递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单: 递归通常可以简单的处理子问题,但是不一定是最好的 ...

  2. 汉诺塔问题 [递归 + 抽象]

    汉诺塔 前言 一.题意 二.抽象思维 1.源码 三.扩展 1.分析 2.源码 总结 参考文献 前言 汉诺塔问题,是学习递归的第一个算法题,也是非常经典的递归问题.由于它是双递归问题,所以初学时不易理解 ...

  3. 【恋上数据结构】递归(函数调用过程、斐波那契数列、上楼梯、汉诺塔、递归转非递归、尾调用)

    递归(Recursion) 什么是递归? 函数的调用过程(栈空间) 函数的递归调用过程 递归实例分析(1 + 2 + 3 + ... + 100 的和) 递归的基本思想.使用套路 斐波那契数列 fib ...

  4. 汉诺塔的递归逐步详解

    文章目录 汉诺塔介绍 递归代码实现 以三个盘子为例逐步详解 汉诺塔介绍 如上图,有三根柱子A,B,C,在A柱子上有N个盘子(图上只画了三个),利用这三根柱子和N个盘子进行汉诺塔游戏,需要最终将A柱子上 ...

  5. python堆栈汉诺塔非递归_汉诺塔问题的递归解法和非递归解法(python语言实现)...

    汉诺塔问题的非递归解法(python语言类解法) #!/usr/bin/env python #coding:utf-8 import sys import time reload(sys) sys. ...

  6. 使用C语言实现汉诺塔问题——递归

    汉诺塔问题: 汉诺塔问题,是心理学实验研究中常用的任务之一.该问题的主要材料包括三根高度相同的柱子和一些大小及颜色不同的圆盘,三根柱子分别为起始柱A.辅助柱B及目标柱C. 1.来源: 相传在古印度圣庙 ...

  7. 汉诺塔问题递归算法python代码_[python]汉诺塔问题递归实现

    一.问题描述及算法步骤 汉诺塔问题的大意是有三根柱子a, b, c,现在a柱有N个盘子从下往上尺寸递减排列,要求: 1. 将a上的盘子移动到c柱上; 2. 每次移动一个盘子; 3. 柱子上的盘子始终必 ...

  8. python面向过程实践汉诺塔_递归汉诺塔-和递归汉诺塔相关的内容-阿里云开发者社区...

    多柱汉诺塔最优算法设计探究 多柱汉诺塔最优算法设计探究 引言 汉诺塔算法一直是算法设计科目的最具代表性的研究问题,本文关注于如何设计多柱汉诺塔最优算法的探究.最简单的汉诺塔是三个柱子(A.B.C),因 ...

  9. labview求n阶乘的和_递归算法(从阶乘、斐波那契到汉诺塔的递归图解)

    递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单: 递归通常可以简单的处理子问题,但是不一定是最好的. 对于递归要分清以下概念: 自己调用自己 递归通常不在意具体操作 ...

最新文章

  1. 【JVM】Java对象创建的流程步骤
  2. 网络营销立足于网站自身的优化与运营
  3. 主生产计划的功能以及其相关MRP类型参数
  4. java反射学习(1):反射的基本操作
  5. javascript自定义事件应用实例
  6. 截取utf8中文字符串
  7. 为什么软件测试容易被小看,做软件测试容易忽视的问题
  8. mybatis 配置详解
  9. 4x root 红米_好激动,红米NOTE4X开发版成功获得完全ROOT教程,非假ROOT!!
  10. 大连理工大学c语言大作业,大连理工大学c语言大作业报告.docx
  11. 数学建模——matlab基本使用
  12. 免费下载IOS/MAc付费软件
  13. freertos demo2: LED blinky queue 发送消息
  14. ftp服务器文件无法删除,ftp服务器文件删除
  15. mfc treectrl设置背景透明_微信透明头像怎么弄 专用透明头像图片更换设置教程闽南网...
  16. 如何在Mac终端删除U盘的隐藏文件
  17. Mybatis-Plus 传入时间查询的方式
  18. 助眠好物推荐,改善睡眠的好方法
  19. Windows Installer:正在安装其他程序。请等待该安装完成,然后再次尝试安装此软件
  20. java.util.concurrent FutureTask

热门文章

  1. ubuntu系统配置记录
  2. solopi是什么测试软件,App性能测试工具Soloπ(一)
  3. 人海源码系列-Reentrantlock
  4. C#.net编写摄像头驱动程序,用avicap32.dll
  5. 傻妞对接青龙,对接QQ、TG、微信。一键、DOCKER安装----JD挂机一体化平台搭建之篇三【2022.11.29】
  6. 三星NC10、ND10上网本Fedora11、Fedora12下屏幕亮度调节
  7. remote: Incorrect username or password ( access token ) fatal: Authentication failed for
  8. 孙佳吉计算机科学技术学院,朱君-计算机科学与技术学院
  9. 如何在html中调用JS文件
  10. mysql 优化 视图_如何优化MySQL视图