汉诺塔问题
1.相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
- 分析:对于这样一个问题,任何人都不可能直接写出移动盘子的每一步,但我们可以利用递归的思想来解决。
首先,基例是有的,即当n1时,只需要将A 上的直接挪到C上即可
其次,想想有没有递推关系: (1)把n个圆盘,从A通过B挪到C上,可以拆解成,先把n-1个圆盘通过C挪到B上,(2)把剩下那一个挪到C上(3)把B上的通过A挪到C上
3.递归程序解决
count = 0
def hanoi(n,src,dst,mid):
global count
if n1:
print('{}->{}'.format(src,dst))
count+=1
else:
hanoi(n-1,src,mid,dst)
print('{}->{}'.format(src,dst))
count+=1
hanoi(n-1,mid,dst,src)
a = int(input('请输入'))
hanoi(a,'A','C','B')
print(count)
请输入3
A->C
A->B
C->B
A->C
B->A
B->C
A->C
7
4.Thoughts
(1)递归可以化繁为简,可以达到数学归纳法(多米诺骨牌)的效果。即,程序不必把每一步都明确,只需要明确,基例、链条,就可以解决问题
(2)尤其是在解决一些过程超级复杂的问题时,递归具有优势
(3)最重要的还是链条的确立。
(4)说到底,这是人很难想出来的方法,计算机是怎么实现的?