一年前,老师用斐波那契数列引领我走进递归的殿堂,同一天,用汉诺塔扼杀了我对递归的好感。。。。。。
今天翻开算法书本来想看看有哪些经典问题被遗漏时,看到了这个汉诺塔,我才想起来当初老师讲这个问题的时候我没听懂,问题被搁置了,今天看见我才想起来,对于现在的我肯定没什么挑战,但是当初刚学递归的时候,真被它弄傻了。
看一下题目吧:

总的来说就是最终将所有圆盘都移动到c上面。移动过程中大圆盘不能在小圆盘上面,每次只能移动一个圆盘。
思考一下,将所有圆盘都移动到c上面,那么肯定需要将[1,n-1]圆盘都移动到b上面,然后a上的最大的圆盘n移动到c上面;然后的问题就变成了将[1,n-1]圆盘从b上借助a移动到c上面。
如果说void Hanoi(int n, char x, char y, char z)是我们的函数,表示将n个圆盘从x上借助y移动到z上面。那么我们肯定是按照刚才分析的,
(1)一开始调用该函数是Hanoi(n, a, b, c)表示将n个圆盘从a上借助b移动到c上。
(2)如果我们完成步骤(1)必须完成先将[1,n-1]圆盘从a上借助c移动到b上(因为只有这样,n圆盘才能从a拿到到c上),调用函数就是Hanoi(n-1,a,c,b),表示将[1,n-1]圆盘从a上借助c移动到b上。
(3)完成步骤1之后,我们要做的就是将b上的[1,n-1]圆盘从b上借助a移动到c上。这个和起初问题一模一样,只不过起初问题是从a借助b移动到c,现在是从b借助a移动到c。
看代码:
首先我们肯定希望n个圆盘从a上借助b,移动到c上

int main()
{Hanoi(n,a,b,c);//①这个调用表示我们想要将n个圆盘从a上借助b移动到c上return 0;
}

剩下的就是Hanoi这个函数了。如果我们要完成将n个圆盘从x上借助y移动到z上,那么肯定需要从x上借助z,将[1,n-1]这些圆盘移动到y上,如下步骤②;移动过后,我们需要将n圆盘从x上拿到z上,如下步骤③;然后,我们需要将b上的[1,n-2]圆盘从y上借助x移动到z,如下步骤④后面就是重复步骤了。注意递归出口,当Hanoi中的n为0时,返回。

void Hanoi(int n, char x, char y, char z)//注意这个n是表示n个圆盘
{if(n == 0) return;Hanoi(n-1, x, z, y);//步骤②move(n, x, z);//步骤③  注意这个n是表示第n个圆盘Hanoi(n-1, y, x, z);//步骤④
}

还剩一个move函数没写,move函数就是简单的将一个圆盘从一个柱子上面移动到另一个柱子上面而已。

void move(int n, char src, char tar)
{printf("将%d从%c移动到%c:%c->%c\n", n, src, tar, src, tar);
}

综合代码:

int g_num = 1;void move(int n, char src, char tar)
{printf("第%d步:将%d从%c移动到%c:%c->%c\n", g_num++, n, src, tar, src, tar);
}void Hanoi(int n, char x, char y, char z)//注意这个n是表示n个圆盘
{if (n == 0) return;Hanoi(n - 1, x, z, y);//步骤②move(n, x, z);//步骤③  注意这个n是表示第n个圆盘Hanoi(n - 1, y, x, z);//步骤④
}int main()
{Hanoi(3, 'a', 'b', 'c');//①这个调用表示我们想要将n个圆盘从a上借助b移动到c上return 0;
}

运行结果;

递归算法——汉诺塔问题相关推荐

  1. python递归算法 - 汉诺塔问题

    python递归算法 - 汉诺塔问题 经典汉诺塔问题: 有三根柱子a,b,c,在一根柱子a上,从下往上按照从大到小的顺序摞着64片黄金圆盘.把所有圆盘从下往上按从大到小的顺序重新摆放在另一根柱子c上. ...

  2. C语言递归算法——汉诺塔问题(河内塔)

    汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...

  3. C语言入门递归算法——汉诺塔(简单易懂,最后还有汉诺塔游戏)

    什么是汉诺塔: 汉诺塔:(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始 ...

  4. 经典递归算法——汉诺塔问题

    一.问题背景简介 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A.B.C),在A杆自下而上.由大到小按顺序放置64个金盘(如图1).游戏的目标: ...

  5. Python 汉诺塔游戏

    递归算法--汉诺塔游戏 递归算法的经典游戏,汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘 ...

  6. 汉诺塔(Hanoi)问题归纳总结

    一.汉诺塔问题及其递归算法 1.问题阐述 经典汉诺塔: 外文算法书对汉诺塔问题的描述: 2.算法步骤 三阶汉诺塔问题解题步骤 共需7步. 四阶汉诺塔问题解题步骤 共需15步 五阶汉诺塔问题解题步骤 可 ...

  7. 汉诺塔递归与非递归算法

    问题描述: 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这 ...

  8. 关于汉诺塔非递归算法的一点思考

    前段时间做编译课设时老师提到了汉诺塔的非递归不容易做出来,于是我趁着寒假有点时间就想试着搞一搞.下面我把我的一些草稿先列出来,以免以后忘记. 下面这个模型是适合于偶数个盘片的情况的.奇数的情况类似可得 ...

  9. python汉诺塔用循环结构实现_Python基于递归算法实现的汉诺塔与Fibonacci数列

    这篇文章主要介绍了Python基于递归算法实现的汉诺塔与Fibonacci数列,结合实例形式分析了汉诺塔与Fibonacci数列的递归实现技巧,需要的朋友可以参考下 本文实例讲述了Python基于递归 ...

最新文章

  1. java List的用法
  2. ERP与全面预算管理如何结合
  3. Java集合框架:WeakHashMap
  4. django中的认证登陆与用户的创建
  5. [导入]Asp.net中动态在中加入Scrpit标签
  6. POJ 3225 - 区间
  7. javascript MouseEvent对象
  8. JAVA(-Xms,Xmx,Xmn-XX:newSize,-XX:MaxnewSize,-XX:PermSize,-XX:MaxPermSize)区别
  9. Javascript实现获取及设置光标位置的方法
  10. 图:试图播放的文件扩展名与文件格式不匹配。播放该文件可能会导致意外行为...的解决办法
  11. 软件质量测试一般方法
  12. 视音频处理大神-雷霄骅
  13. 独自封装windows 10系统详细教程(三)
  14. 解决Mac谷歌浏览器问题
  15. HiCar目前支持的手机型号
  16. html调用wmp,web页面中嵌入window media player,支持IE和Chrome
  17. 手把手教你玩转KVM虚拟机--KVM管理虚拟机
  18. python snmp-cmds get示例
  19. 西部数据绿盘、蓝盘、黑盘、红盘和紫盘的区别
  20. 图像超分辨率重建(pytorch)

热门文章

  1. Day11多态部分-6 【1.5 多态的好处和弊端】
  2. web_安全_文件上传漏洞
  3. iOS之深入解析消息转发objc_msgSend的应用场景
  4. 【数据结构与算法】之深入解析“罗马数字转整数”的求解思路与算法示例
  5. Django学习~1
  6. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1044:判断是否为两位数
  7. 【Android】Android中WIFI开发总结(一)
  8. [Qt教程] 第49篇 进阶(九) 多媒体应用简介
  9. c语言 链表 删除节点,C语言实现单链表节点的删除(不带头结点)
  10. opencv编译python库_linux 下编译安装 opencv-python