赞
踩
感谢漂流的云的图解汉诺塔问题(递归求解)
(1)先从最简单的模型开始,假如A
柱有2
个盘,我们的任务是把这两个盘按照规则(小叠在大上)移到C
柱。操作步骤如下所示:
(2)现在把原始时A
柱盘子数增加到100
,那步骤不言而喻变得很复杂,但是我们可以通过一种方法把复杂的问题简单化:
可能此时你会觉得什么!怎么可以直接把这一大块就这样移过来!我们可以把那一大块红色再次看为2
与一大块
,让2
成为最大的蓝色
,3~100
成为红色
:
(3)以此类推到最顶部的100
和99
的移动,也就是我们一开始,拿到一个汉诺塔会去做的一件事:
在完成第一个回合,及99
和100
成功脱离黑色块
,也就是上图的最后一步,我们再次把99
和100
合体为新的红色块
,与新的蓝色块
——98
开始新一回合的移动。以此类推下去,就最终完成全部盘子从A
柱到另外的柱子。
(4)我们再次回到第一次只有两个对象的那张图,不过这一次,我们假设在A
柱上我们有n
个盘子,这时候,还是蓝
和红
的移动——蓝
为1
,红
为n-1
我们把移动步骤都列举下来:
n-1
from A --> B
1
from A --> C
n-1
from B --> C
(5)最后,我们通过创建一个move( )函数,来实现这一功能:
def move(n, a, b, c):
if n == 1:
print(a, '-->', c)
else:
move(n-1, a, c, b)
move(1, a, b, c)
move(n-1, b, a, c)
a = input('请输入A柱盘子的个数:')
num = int(a)
print('把',num,'个盘子全部移到C柱子的顺序为:')
move(num, 'A', 'B', 'C')
所谓递归函数,就是一个函数在内部调用其自身本身的函数。以上的move( )
函数就是一个很经典的递归函数,在循环语句的else
部分,通过不断地调用自己,完成移动。move( )函数中,总共有4个参数:n
, a
, b
, c
。当n==1
时,由第2位参数 --> 第4位参数。因此else
部分的函数其实表达的是a --> b
; a --> c
; b --> c
,及是(4)中模型的移动步骤。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。