您小时候玩过汉诺塔吗?有没有手忙脚乱,晕头转向的赶脚?

        汉诺塔(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 与神奇的数学之汉诺塔相关推荐

  1. python学习-递归(阶乘、汉诺塔)

    文章目录 求阶乘(循环) 求阶乘(递归) 汉诺塔 求阶乘(循环) 如果需要求一个数的阶乘,可能刚开始脑海里面冒出来的是循环计算,下面看看循环如何实现: def recur1(num):rst1 = 1 ...

  2. 汉诺塔python输出移动个数_Python:汉诺塔移动路径打印实现

    作为一名python小白,在初学python的这几日遇到了一个还算有趣的问题,就是汉诺塔移动路径的打印,在这里简单说下: 汉诺塔问题:汉诺塔是由三根杆子A,B,C组成的.A杆上有N个(N>1)穿 ...

  3. python汉诺塔运行程序_用python编写一个程序,得到汉诺塔的解决方案

    古代有一座汉诺塔,塔内有3个座A.B.C,A座上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示. 有一个和尚想把这n个盘子从A座移到C座,但每次只能移动一个盘子,并且自移动过程中,3个座上的盘 ...

  4. python汉诺塔递归算法流程图,python实现汉诺塔递归算法经典案例

    Python汉诺塔递归问题 python请用递归算法编程解决汉诺塔问题 在线等 关于python递归函数实现汉诺塔 def move(n,a,b,c): #1 if n==1: #2 print(a, ...

  5. 汉诺塔递归问题的分析与Python实现

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

  6. 汉诺塔递归Python实现

    大二学习数据结构的时候知道了汉诺塔问题,由于当时不求甚解对这个问题没真正理解.今天学习廖雪峰python教程遇到了递归实现汉诺塔的练习,这才终于真正理解了汉诺塔递归的问题. 汉诺塔问题:有三个柱子A, ...

  7. 汉诺塔问题(分治+源码+动画演示)

    汉诺塔问题(分治+源码+动画演示) 汉诺塔问题源自印度一个古老的传说,印度教的"创造之神"梵天创造世界时做了 3 根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆 ...

  8. Python 算法之递归与尾递归,斐波那契数列以及汉诺塔的实现

    文章目录 递归概念 递归要素 递归与迭代的区别 示例一:阶乘 示例二:斐波那契数列 示例三:汉诺塔问题 尾递归 Python 中尾递归的解决方案 递归概念 递归:程序调用自身的编程技巧称为递归( re ...

  9. python汉诺塔_汉诺塔递归算法/搬金盘的婆罗门 - Python实现

    汉诺塔递归算法/搬金盘的婆罗门 - Python实现 版权声明 本文节选自作者本人的图书<Python编程基础及应用>,高等教育出版社.本文可以在互联网上自由转载,但必须:注明出处(作者: ...

最新文章

  1. java jstat 命令_java高分局之jstat命令使用(转)
  2. CoreLocation框架--监测方向/地磁传感器
  3. gittrack_Git 分支跟踪详解(remote branch tracking)
  4. [SCOI2010]连续攻击游戏
  5. CleanWipe:无需密码彻底卸载Symantec(赛门铁克)
  6. Servlet是什么
  7. yum配置和文泉驿字体安装
  8. vue4 跳转外部链接_vue项目跳转到外部链接
  9. Mac 重置mysql的root 密码
  10. 博客园增加Live2D看板娘教程,超级简单,一看就懂
  11. Myeclipse中@auther
  12. 2021年web前端基础面试题
  13. CSS3+JS完美实现放大镜模式
  14. 金融风控训练营Task1学习笔记
  15. 好奇心 I UX 设计之旅 - 初识 UX
  16. 数据库之数据库的部署与管理
  17. 有哪些证件扫描软件?六种值得一试的途径
  18. Oracle表空间不足ORA-01654
  19. Java基础复习(六)
  20. Ubuntu20.04下解决Qt出现qt.qpa.plugin:Could not load the Qt platform plugin “xcb“ 问题

热门文章

  1. Qt平台添加OpenCV库
  2. CTFSHOW-信息搜集
  3. 深度学习 如何查看 GPU使用情况
  4. 三棱锥之刻(求三棱锥中心球与表面覆盖面积之和)
  5. 量化投资:用Python实现金融数据的获取与整理
  6. 计算机水平每分钟多少字,电脑打字每分钟打多少在一才算快啊? 一般拼音打字一分钟多少才算可以?...
  7. 201671030107胡文艳《英文文本统计分析》结对项目报告
  8. opengl与显卡驱动的关系
  9. 08_01_分布式架构搭建拉勾教育PC站
  10. Android Audio常用音频工具和分析方法