汉诺塔算法

汉诺塔算法 ----C++语言递归实现

线上幽灵 2018-04-24 17:19:59

8159

收藏 26分类专栏:算法 文章标签:汉诺塔版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/chen134225/article/details/80067518版权起源汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。抽象为数学问题如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数

解:(1) n == 1​ 第1次 1号盘 A—->C sum = 1 次(2) n == 2​ 第1次 1号盘 A—->B​ 第2次 2号盘 A—->C​ 第3次 1号盘 B—->C sum = 3 次(3)n == 3​ 第1次 1号盘 A—->C​ 第2次 2号盘 A—->B​ 第3次 1号盘 C—->B​ 第4次 3号盘 A—->C​ 第5次 1号盘 B—->A​ 第6次 2号盘 B—->C​ 第7次 1号盘 A—->C sum = 7 次不难发现规律:​ 1个圆盘的次数 2的1次方减1​ 2个圆盘的次数 2的2次方减1​ 3个圆盘的次数 2的3次方减1​ 。 。 。 。 。​ n个圆盘的次数 2的n次方减1故:移动次数为:2^n - 1算法分析(递归算法)我们在利用计算机求汉诺塔问题时,必不可少的一步是对整个实现求解进行算法分析。到目前为止,求解汉诺塔问题最简单的算法还是同过递归来求,至于是什么是递归,递归实现的机制是什么,我们说的简单点就是自己是一个方法或者说是函数,但是在自己这个函数里有调用自己这个函数的语句,而这个调用怎么才能调用结束呢?,这里还必须有一个结束点,或者具体的说是在调用到某一次后函数能返回一个确定的值,接着倒数第二个就能返回一个确定的值,一直到第一次调用的这个函数能返回一个确定的值。实现这个算法可以简单分为三个步骤:(1) 把n-1个盘子由A 移到 B;(2) 把第n个盘子由 A移到 C;(3) 把n-1个盘子由B 移到 C;从这里入手,在加上上面数学问题解法的分析,我们不难发现,移到的步数必定为奇数步:(1)中间的一步是把最大的一个盘子由A移到C上去;(2)中间一步之上可以看成把A上n-1个盘子通过借助辅助塔(C塔)移到了B上,(3)中间一步之下可以看成把B上n-1个盘子通过借助辅助塔(A塔)移到了C上;C++源代码#include <iostream>using namespace std;void Move(int n, char A, char B, char C){if (n == 1){//圆盘只有一个时,只需将其从A塔移到C塔cout << "move " << n << " from " << A << " to " << C << endl;}else{Move(n - 1, A, C, B);//递归,把A塔上编号1~n-1的圆盘移到B上,以C为辅助塔cout << "move " << n << " from " << A << " to " << C << endl;//把A塔上编号为n的圆盘移到C上Move(n - 1, B, A, C);//递归,把B塔上编号1~n-1的圆盘移到C上,以A为辅助塔}}void Hanoi(int n){if (n <= 0)return;Move(n, 'A', 'B', 'C');}int main(){Hanoi(3);return 0;}程序运行截图

点赞 10

评论 1

分享 x海报分享扫一扫,分享海报

收藏 26

打赏

举报关注一

(0)

相关推荐

  • 汉诺塔问题的两种解法(4)

    第四节 汉诺塔问题的递归解法--移动所有盘子 上一节我们实现了连续移动两个盘子(数字),现在我们发挥一点儿想象力,将上一节的两个盘子当作一个盘子来处理,从而得出移动3个盘子的过程,代码如图22所示. ...

  • 汉诺塔问题的两种解法(2)

    第二节 关键性结论 通过反复实践与观察,我们发现了解决汉诺塔问题的思路.无论圆盘的数量有多少,我们都可以把它们当作2个盘子来处理.假设共有N个圆盘,我们把它们想象为两个圆盘,其中一个圆盘是整个塔的塔底 ...

  • Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏

    Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏 输出结果 核心代码 def hanoi(n,x,y,z): if n==1: print(x,'--→',z) else: hano ...

  • 你会玩汉诺塔吗?——让递归算法来帮你,只需“3步”

    今天我们来介绍一种很常见的算法--递归. 递归函数 什么是递归?简单的说,递归就是通过不断调用自己,来完成不断循环的一个过程. 可能概念有些拗口,我们编写一个递归函数来说明.斐波那契数列大家都知道,它 ...

  • 汉诺塔问题的两种解法(1)

    汉诺塔是一种益智玩具,源自古老的印度.如图1.图2及图3所示,有三根柱子,若干个大小不等的圆盘按顺序依次叠落在起点(左侧)的柱子上,通过多次移动后,全部圆盘要叠落在终点(右侧)的柱子上.移动必需遵守两 ...

  • 汉诺塔问题,五个盘子具体走法

    我移了三盘的和四盘的,就是推不出五盘的...笨嘛...等指教 1个回答 满意答案 fatso1118 推荐于 2017.12.15 五个柱子!分别为1号 2号 3号 五个盘子 A B C D E 这样 ...

  • 汉诺塔的递归问题

    gzqldz9t32013.05.25 看书还是不怎么理解,当盘子为4个时候的,怎么移动,例子都是3个 gzqldz9t3 采纳率:53%    等级:11 已帮助:16112人 私信TA向TA提问 ...

  • 汉诺塔递归算法流程图的搜索结果

    汉诺塔递归算法流程图的搜索结果

  • C++ - 汉诺塔

    >=FreeMan=<2019-02-22 14:50:27 分类专栏:C++文章标签:汉诺塔C++ 版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链 ...

  • c/c++ 递归实现汉诺塔问题(代码内部运行详细解释)。

    Wings_of_freedom2020-04-23 18:08:14 114 收藏 文章标签:算法c++数据结构 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...

  • 如何玩八层的汉诺塔?

    8层汉诺塔共有: 2^8 - 1 = 255个步骤 以下是移动的过程:(说明: A表示第一个柱子   B表示第二个珠子  C表示第三个柱子  -->表示盘的移动方向) 对于汉诺塔问题的求解,可以 ...

  • 关于C++的递归(以汉诺塔为例)

    关于C++,hanoi塔的递归问题一直是个经典问题,我们学习数据结构的时候也会时常用到, 因为它的时间复杂度和空间复杂度都很高,我们在实际的应用中不推荐使用这种算法,移动n个盘子, 需要2的n次幂减一 ...

  • 关于C语言汉诺塔问题,当程序执行到001、002、003步时,不知道具体是个什么步骤,求大神解惑!

    关于C语言汉诺塔问题,当程序执行到001.002.003步时,不知道具体是个什么步骤,求大神解惑! 狼首破vtb8452016.06.12浏览17次其他分享举报 #include<stdio.h ...