Python 与神奇的数学之汉诺塔
您小时候玩过汉诺塔吗?有没有手忙脚乱,晕头转向的赶脚?
汉诺塔(Tower of Hanoi)源于印度的古老传说:大梵天创造世界的时候做了三根金刚石柱子,其中一根柱子自下而上按大小顺序摞着64个黄金圆盘。大梵天命令婆罗门把圆盘按大小顺序重新摆放到另一根柱子上,并且规定,大圆盘不能放小圆盘上,三根柱子之间一次只能移动一个圆盘。
如此这般,得移动多少次呢?
和汉诺塔故事相似的,还有另外一个印度传说 :舍罕王打算奖赏国际象棋的发明人──宰相西萨·班·达依尔。国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第1个小格里赏给我一粒麦子,在第2个小格里给2粒,第3个小格给4粒,以后每一小格都比前一小格加一倍。请您把这样摆满棋盘上所有64格的麦粒,都赏给您的仆人吧!”国王觉得这个要求太容易满足了,就命令给他这些麦粒。当人们把一袋一袋的麦子搬来开始计数时,国王才发现:就是把全印度甚至全世界的麦粒全拿来,也满足不了那位宰相的要求。
如果数字限制了我们的想象力,那让我们化繁为简,先从简单的做起,由此发现其中的规律。
1个圆盘的时候移动1次;
2个圆盘的时候移动3次;
3个圆盘的时候......
让我们看一下动图:
结果为7次,也即3个圆盘重新摞在一起需要的次数为7;
4个圆盘时,其上面3个圆盘如此这般摞在一起仍旧要用7次,再如此这般挪动到之前挪动到空白柱子的第四个圆盘上还要7次,因此其需要的总次数就是:
“3个圆盘重新摞在一起的次数”+1次+“3个圆盘重新摞在一起需要的次数”
=2x“3个圆盘重新摞在一起的次数”+1次
=15次。
……
可见,n个圆盘时搬动的次数是2x“(n-1)个圆盘重新摞在一起的次数”+1次。由于1 个圆盘的时候是1次,n个圆盘的时候则为(2^n-1)次。
汉诺塔是典型的递归问题,其可演示移动过程的代码如下:
#汉诺塔(假设圆盘由小到大编号为1->N)n=eval(input('请输入圆盘数:'))
count=0def hanoi(n,sp,ep,bu): #sp:start point; ep:end point; bu:bufferglobal countif n==1:print('{}号:{}->{}'.format(1,sp,ep))count+=1else:hanoi(n-1,sp,bu,ep) print('{}号:{}->{}'.format(n,sp,ep)) hanoi(n-1,bu,ep,sp)count+=1hanoi(n, 'A', 'C', 'B') #相应柱子标记为A,C,Bprint('需要移动{}次'.format(count))
以3个圆盘为例,移动过程为:
以递归函数呈现的 python 代码则为:
n=eval(input('请输入圆盘的数目:'))def f(n):if n==1:return 1else:return 2*f(n-1)+1print('需要移动',f(n),'次')
回到题头,当圆盘数为64时,需要移动的次数为:18,446,744,073,709,551,615!如果移动一次需要1秒,那需要的时间简直不可想象!!!
如果您一定要问我是多久,⊙▂⊙,大约是天荒地老吧……
Python 与神奇的数学之汉诺塔相关推荐
- python学习-递归(阶乘、汉诺塔)
文章目录 求阶乘(循环) 求阶乘(递归) 汉诺塔 求阶乘(循环) 如果需要求一个数的阶乘,可能刚开始脑海里面冒出来的是循环计算,下面看看循环如何实现: def recur1(num):rst1 = 1 ...
- 汉诺塔python输出移动个数_Python:汉诺塔移动路径打印实现
作为一名python小白,在初学python的这几日遇到了一个还算有趣的问题,就是汉诺塔移动路径的打印,在这里简单说下: 汉诺塔问题:汉诺塔是由三根杆子A,B,C组成的.A杆上有N个(N>1)穿 ...
- python汉诺塔运行程序_用python编写一个程序,得到汉诺塔的解决方案
古代有一座汉诺塔,塔内有3个座A.B.C,A座上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示. 有一个和尚想把这n个盘子从A座移到C座,但每次只能移动一个盘子,并且自移动过程中,3个座上的盘 ...
- python汉诺塔递归算法流程图,python实现汉诺塔递归算法经典案例
Python汉诺塔递归问题 python请用递归算法编程解决汉诺塔问题 在线等 关于python递归函数实现汉诺塔 def move(n,a,b,c): #1 if n==1: #2 print(a, ...
- 汉诺塔递归问题的分析与Python实现
背景 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A.B.C),在A杆自下而上.由大到小按顺序放置64个金盘(如图).游戏的目标:把A杆上的金盘 ...
- 汉诺塔递归Python实现
大二学习数据结构的时候知道了汉诺塔问题,由于当时不求甚解对这个问题没真正理解.今天学习廖雪峰python教程遇到了递归实现汉诺塔的练习,这才终于真正理解了汉诺塔递归的问题. 汉诺塔问题:有三个柱子A, ...
- 汉诺塔问题(分治+源码+动画演示)
汉诺塔问题(分治+源码+动画演示) 汉诺塔问题源自印度一个古老的传说,印度教的"创造之神"梵天创造世界时做了 3 根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆 ...
- Python 算法之递归与尾递归,斐波那契数列以及汉诺塔的实现
文章目录 递归概念 递归要素 递归与迭代的区别 示例一:阶乘 示例二:斐波那契数列 示例三:汉诺塔问题 尾递归 Python 中尾递归的解决方案 递归概念 递归:程序调用自身的编程技巧称为递归( re ...
- python汉诺塔_汉诺塔递归算法/搬金盘的婆罗门 - Python实现
汉诺塔递归算法/搬金盘的婆罗门 - Python实现 版权声明 本文节选自作者本人的图书<Python编程基础及应用>,高等教育出版社.本文可以在互联网上自由转载,但必须:注明出处(作者: ...
最新文章
- java jstat 命令_java高分局之jstat命令使用(转)
- CoreLocation框架--监测方向/地磁传感器
- gittrack_Git 分支跟踪详解(remote branch tracking)
- [SCOI2010]连续攻击游戏
- CleanWipe:无需密码彻底卸载Symantec(赛门铁克)
- Servlet是什么
- yum配置和文泉驿字体安装
- vue4 跳转外部链接_vue项目跳转到外部链接
- Mac 重置mysql的root 密码
- 博客园增加Live2D看板娘教程,超级简单,一看就懂
- Myeclipse中@auther
- 2021年web前端基础面试题
- CSS3+JS完美实现放大镜模式
- 金融风控训练营Task1学习笔记
- 好奇心 I UX 设计之旅 - 初识 UX
- 数据库之数据库的部署与管理
- 有哪些证件扫描软件?六种值得一试的途径
- Oracle表空间不足ORA-01654
- Java基础复习(六)
- Ubuntu20.04下解决Qt出现qt.qpa.plugin:Could not load the Qt platform plugin “xcb“ 问题