内容简介:当我们学习一门编程语言的时候,都会遇到递归函数这个问题。而学习递归的一个经典案例就是汉诺塔问题。通过这篇文章,观察移动三个盘子和四个盘子的详细过程,您不仅可以深刻的了解递归,也更加熟悉了汉诺塔的游戏的玩法。有a、b、c三个柱子,a从上到下,从小到大有n个盘子。要求把a上所有盘子移动到c,一次只能移动一个盘子,且大盘子不能放小盘子上。也就是:
当我们学习一门编程语言的时候,都会遇到递归函数这个问题。而学习递归的一个经典案例就是汉诺塔问题。通过这篇文章,观察移动三个盘子和四个盘子的详细过程,您不仅可以深刻的了解递归,也更加熟悉了汉诺塔的游戏的玩法。
规则
有a、b、c三个柱子,a从上到下,从小到大有n个盘子。要求把a上所有盘子移动到c,一次只能移动一个盘子,且大盘子不能放小盘子上。
方法
- 当a上有一个盘子时,直接把该盘子移动到c。
- 当a上有n个盘子时(n > 1):
先把a上n-1个盘子移动到b,
再把a上最后一个盘子移动到c,
再把b上所有盘子移动到c。
代码实现
def mov(n,a,b,c): if n == 1: # 如果a上只有一个盘子,直接把a移动到c print(a,'-->',c) else: # 先把a上的n-1个盘子移动到b mov(n-1,a,c,b) # 再把a上最后一个盘子移动到c mov(1,a,b,c) # 最后把b上所有盘子(n-1个)移动到c mov(n-1,b,a,c) num = abs(int(input('一共有几个盘子:'))) print('\n移动步骤为:') mov(num,'A','B','C')
3个盘子的实例
- 先把a上的2个移动到b
先把a上的1个移动到c
再把a上 最后 1个移动到b
再把c上 仅有的 一个移动到b
- 再把a上 最后 一个移动到c
- 再把b上的两个移动到c
先把b上的一个移动到a
再把b上 最后 一个移动到c
再把a上 仅有的 一个移动到c
也就是:
A –> C A –> B C –> B A –> C B –> A B –> C A –> C
4个盘子的实例
- 先把a上的三个移动到b(套用上面三个盘子的情况,只不过之前是移动到c,现在是b)
先把a上的2个移动到c
先把a上的1个移动到b
再把a上 最后 1个移动到c
再把b上 仅有的 一个移动到c
再把a上 最后 一个移动到b
再把c上的两个移动到b
先把c上的一个移动到a
再把c上 最后 一个移动到b
再把a上 仅有的 一个移动到b
- 再把a上 最后 一个移动到c
- 再把b上的3个移动到c(还是第一步的思路,只是换了个柱子)
先把b上的2个移动到a
先把b上的1个移动到c
再把b上 最后 1个移动到a
再把c上 仅有的 一个移动到a
再把b上 最后 一个移动到c
再把a上的两个移动到c
先把a上的一个移动到b
再把a上 最后 一个移动到c
再把b上 仅有的 一个移动到c
也就是:
A –> B
A –> C
B –> C
A –> B
C –> A
C –> B
A –> B
A –> C
B –> C
B –> A
C –> A
B –> C
A –> B
A –> C
B –> C
这样就清晰的看出移动的各个步骤。
总结
再反过来分析一下,当移动一个盘子的时候只需一步就能完成,对应于代码中的
if n == 1: # 如果a上只有一个盘子,直接把a移动到c print(a,'-->',c)
当移动两个盘子的时候,得需要三步才能完成。例如:把a上的两个盘子移动到c
- 先把a上的1个移动到b
- 再把a上 最后 1个移动到c
- 再把b上 仅有的 一个移动到c
当移动三个盘子的时候,就可以分解成先移动两个盘子,再移动一个盘子。
当移动四个盘子的时候,就可以分解为先移动三个盘子,再移动一个盘子。依次类推。。
可见当移动两个或两个以上个数盘子的时候,都只需要三步就可以完成。其中每一步又可以分解为三步,直到只剩下一个盘子的情况。对应于代码中的
else: # 先把a上的n-1个盘子移动到b mov(n-1,a,c,b) # 再把a上最后一个盘子移动到c mov(1,a,b,c) # 最后把b上所有盘子(n-1个)移动到c mov(n-1,b,a,c)
所以,汉诺塔问题,你了解了吗?
参考: python下实现汉诺塔
本文作者:小friend
本文链接:http://www.hellomao.top/2019/05/14/daily_hannuota/
版权声明:本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
ASP.NET 4高级程序设计(第4版)
Matthew MacDonald / 博思工作室 / 人民邮电出版社 / 2011-6 / 148.00元
《ASP.NET 4高级程序设计(第4版)》,本书是ASP.NET领域的鸿篇巨制,全面讲解了ASP.NET4的各种特性及其背后的工作原理,并给出了许多针对如何构建复杂、可扩展的网站从实践中得出的建议。一起来看看 《ASP.NET 4高级程序设计(第4版)》 这本书的介绍吧!