汉诺塔问题的递归算法和非递归算法分析

不想看文字的可以在B站看详细的讲解,点击蓝字->汉诺塔问题的递归和非递归算法

问题描述

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置n个金盘(依次标号1到n)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

问题分析(递归算法)

如果A杆上只有一个盘子,则直接将盘子从A杆移至C杆即可。

如果A上有2个盘子,则需要先把1号盘子挪到辅助杆B上,再把2号盘挪到目标杆C上,最后把B杆上的1号盘挪到C杆上即可完成。
A杆上的盘子数目逐渐增加到n,我们无法直观的得到结果。于是想到将n个盘子看做两部分,一个部分为上层的(n-1)个盘子,另一个部分为最底下的一个盘子。

于是,三步就可以完成移动:
①借助C杆将(n-1)个盘子从A杆移动到B杆;


②把n号盘子从A杆移到C杆

③借助A杆把(n-1)个盘子从B杆移到C杆

递归算法:
#include <iostream>
using namespace std;    void hanoi( char A, char B, char C, int n){if(n>0){hanoi(A, C, B, n - 1);    //将(n-1)个盘子从A移至Bcout <<n<<" from "<< A << " to " << C << endl;  //将最底下的一个盘子从A移到Chanoi(B, A, C, n - 1);  //把(n-1)个从B移至C}
}int main()
{int n;char a='A',b='B',c='C';cin>>n;hanoi(a,b,c,n);
}
时间复杂度分析

当规模为n时时间函数为T(n),在代码中,两次调用规模为(n-1)的汉诺塔函数,还有一次输出语句,运算时间为常数n,所以时间函数为T(n)=2*T(n-1)+1。


最后求得递归算法的时间复杂度为O(2n)。

问题分析(非递归算法)


举个例子,当n=3时。因为是奇数,所以杆的摆放顺序为ACB。之后循环进行两步操作。如下图所示:

图片右上角是用这种规律移动的步骤,可验证与用递归算法移动的步骤完全相同。

代码实现
#include<iostream>
#include <stack>
using namespace std;char s[4] = { '0','A','B','C'};
stack<int> a[4];void move(int now,int next){ //用来移动的函数 a[next].push(a[now].top());printf("%d from %c to %c\n", a[now].top(),s[now], s[next]);a[now].pop();
}int main() {int  n;cin >> n;for (int i = 0; i < n; i++)a[1].push(n - i);//把盘子从大到小入栈 if (n%2 == 1) {//如果n为奇数则杆的排列顺序为ACB s[2] = 'C'; s[3] = 'B';}while (1) {int next;//用来记录第一步中的下一个杆; for(int i=1;i<=3;i++)//将最小圆盘移动到下一个杆上if(!a[i].empty()){if(a[i].top()==1){if(i==3) next=1;else next=i+1;move(i,next);//移动 break;}}if(a[2].size()==n || a[3].size()==n) break;int other1,other2;//记录第二步中的另外两个杆 switch(next){case 1:{other1=2;other2=3;break;}case 2:{other1=3;other2=1;break;}case 3:{other1=1;other2=2;break;}}if(a[other1].empty())//移动到空杆 move(other2,other1);  else if(a[other2].empty())move(other1,other2);else{if(a[other1].top()<a[other2].top())// 把较小的那个圆盘移动到较大的那个圆盘上move(other1,other2);else move(other2,other1);    }}
}

可证明非递归算法的时间复杂度也是O(2n),再次证明了汉诺塔问题的递归算法和非递归算法其实是一回事。
但是严格的证明应该采用数学归纳法,我不会,就不说了。
汉诺塔问题的递归和非递归算法

汉诺塔问题的递归算法和非递归算法分析相关推荐

  1. 【头歌】汉诺塔(Hanoi)的递归算法

    任务描述 本关任务:汉诺塔(Hanoi)的递归算法. 相关知识 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A.B.C),在A杆自下而上.由大到 ...

  2. python汉诺塔递归算法_Python文摘:汉诺塔问题与递归算法

    历史传说: 在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜 ...

  3. Python文摘:汉诺塔问题与递归算法

    历史传说: 在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜 ...

  4. 汉诺塔问题的Java实现(递归与非递归)

    文章目录 一.汉诺塔问题描述 二.汉诺塔解题思路 三.递归 四.非递归 一.汉诺塔问题描述 汉诺塔问题就是有三张柱子A.B.C,然后初始化在A上放了N个圆盘,圆盘按照小压大的方式堆放,需要用最少的步骤 ...

  5. python汉诺塔递归算法流程图_python实现汉诺塔的图解递归算法

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

  6. 汉诺塔(Tower of Hanoi) 递归代码实现 c语言(顺序栈实现)

    文章目录 c语言简化版 C语言强化版(能看到每一步每个塔的情况)(使用了顺序栈库) main.c sequential_stack.cpp sequential_stack.h 运行结果 找了个汉诺塔 ...

  7. 汉诺塔(Tower of Hanoi)--------递归思路

    汉诺塔问题简介: 有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移到柱子C上,并且每次移动,同一根柱子上都只能是大盘子在下,小盘子在上,请 ...

  8. 图解汉诺塔,用Python实现经典递归

    感谢漂流的云的图解汉诺塔问题(递归求解) (1)先从最简单的模型开始,假如A柱有2个盘,我们的任务是把这两个盘按照规则(小叠在大上)移到C柱.操作步骤如下所示: (2)现在把原始时A柱盘子数增加到10 ...

  9. c语言递归汉诺塔次数,汉诺塔问题(C语言经典递归问题(一))

    把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好. 操作规则: 每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A.B.C任一杆上. 思路: 图解: ...

最新文章

  1. ad远程控制用户计算机,远程控制电脑|远程控制计算机|怎样远程控制电脑 - ManageEngine Remote Access Plus...
  2. 【Android 逆向】Android 逆向通用工具开发 ( 静态库项目中的网络操作核心类 CNetwork 分析 )
  3. DC学院学习笔记(十四):总体、采样及Error Bar
  4. Linux环境配置1
  5. php处理j数组,PHP Bean 类处理 数组处理
  6. 利用非数组的方法输出杨辉三角
  7. ps中如何同图层获取css代码
  8. 加权回归估计_比率估计与回归估计
  9. eclipse修改java热部署免重启tomcat在Host标签下增加Context直接将docBase指定为项目的WebContent路径
  10. win7 64位 内核安全_Win7进入死亡倒计时,全国一半电脑要遭殃?
  11. 20170910算法工程师在线笔试之求第n个丑数
  12. 基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送
  13. Android实现抖音无水印视频
  14. EEPROM与FLASH闪存到底有什么区别?
  15. 中国英语学习论坛(3)
  16. WPF中应用toolkit Chart控件安装
  17. rocketMQ的消息介绍、发送方式和消费方式
  18. 赛效:WPS文字(Word)插入图片后如何移动图片
  19. 编码、字符集编码、UTF8mb3/UTF8mb4
  20. 一分钟让你了解什么是CYN

热门文章

  1. B. 三维空间的点(继承)
  2. 栈和队列的区别,栈和堆得区别
  3. 【毕业设计/matlab系列】基于区域生长和形态学处理的道路检测实现【含Matlab源码】
  4. 【数据结构】Java实现栈
  5. 龙芯开源社区服务器迁移一览
  6. np.piecewise函数用法
  7. (五)图片压缩 —— 优化图片文件、内存
  8. 服务器上数据库连接超时问题
  9. 用通俗的话解释下offsetHeight
  10. Python办公自动化:制作报表并发送到邮箱