递归的思想在初中数学中已经有涉及,河内塔问题也是那时候试卷爱考的填空题,我还记得答案是2^n-1.
问题描述:
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
解决思路:
我们简化一下:
只有一个圆盘的时候,就直接将这唯一的一个也是最大的一个圆盘从A柱挪到C柱就好了嘛。
所以,
在有多个圆盘的时候,首先将最大的圆盘挪到C柱,其余的都挪到B柱,然后再将B柱中最大的挪到C柱上。。。如此往复。
有很多很多圆盘的时候。。。
step1:
A是出发柱,C是目标柱,B是备用柱,A上最大的圆盘往C上挪;
step2:
B是出发柱,C是目标柱,A是备用柱,B上最大的圆盘往C上挪;
step3:
A是出发柱,C是目标柱,B是备用柱,A上最大的圆盘往C上挪;
step4:
B是出发柱,C是目标柱,A是备用柱,B上最大的圆盘往C上挪;
。。。
Step n:
A/B柱上就剩一个圆盘,直接挪到C柱上。
则有:
move(1)=1
move(n)=2*move(n-1)+1 (n>1)
move(n)=2^n-1 (n>=1)
Python实现:
def move(n, a, b, c):
if n==1:
print a,'-->',c
return
else:
move(n-1,a,c,b)
print a,'-->',c
move(n-1,b,a,c)
#调用
move(4, 'A', 'B', 'C')
结论
最后输出的结果可以看到是符合国外某数学学家发现的简单解决方法的
轮流进行两步操作:首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C;
若n为奇数,按顺时针方向依次摆放 A C B。
⑴按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。
⑵接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。
⑶反复进行⑴⑵操作,最后就能按规定完成汉诺塔的移动。
所以结果非常简单,就是按照移动规则向一个方向移动金片:
如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C