您的位置:首页 > 其它

典型递归的思想解决汉诺塔问题

2017-04-13 16:29 197 查看
def hanoi(a,b,c,n):#借助b柱子将a柱子的盘子移动到c柱子
if(n==1):#只有一个盘子,直接完成移动
print(a,'->',c)
else:
hanoi(a, c, b, n-1)#借助c柱子先将n-1个盘子移动到b柱子
print(a,'->',c)#再将a上最后一个盘子移动到c柱子
hanoi(b, a, c, n-1)#再借助a柱子将b柱子上的n-1个盘子移动到c柱子
hanoi('a', 'b', 'c', 3)


这里用到了递归的思想,但是也要考虑整体思想,当初始问题的a上的盘子数大于等于2时,我们完全可以将其看作是两部分,第一部分是除了最大盘子之外的集合,第二部分是最大盘子,然后进行递归。

移动步数推导:

移动k+1个盘子需要的次数与移动k个盘子的次数之间的关系是:

a[k+1] = a[k] + 1+ a[k] = 2a[k] + 1

所以a[k]+1 + 1 = 2*(a[k] + 1)【这是个等比数列高中学过的】

即a[k + 1] = (a[1] +1)* 2^n-1 = 2^n 因此a[k] = 2^n - 1

至此,证明完毕。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: