递归实现汉诺塔

关于汉诺塔递归的思考

很久前就在廖雪峰的python教程看过这个问题,没有认真想,只是一知半解,今天碰到问题也是讲递归,又讲到汉诺塔问题,搜索了很多终于想通了,记录一下小白的理解思路。

有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:1.每次只能移动一个圆盘.2.大盘不能叠在小盘上面.我以前都是用类似演绎的方法去思考的,比如1个盘是怎样的移动,2个盘是怎样的移动,3个盘是怎样的移动……然后再来找其中共同的规律。好像也没有不可以,不过比较繁琐,而且这题既然是递归的常用例子,还是用递归来想想。

注意关键点:

2.大盘不能叠在小盘上面.想通了(当然也是在搜索和思考后),其实这个问题可以分解成三步,假设A杆上有n个盘,第一步把A杆上面的n-1个盘移动到B杆;第二步,那么就剩最后也是最大的那一个盘,我们就把它直接从A杆移动到C杆;第三步,把剩下的n-1个盘从B杆移动到C杆。

基本的移动思路有了,我们来想象一下,当有n-1个盘在A杆时,也是使用这样的三步来使圆盘移动到C杆上,只是第一步变成了移动n-2个盘到B杆,第三步变成把剩下n-2个盘从B杆移动到C杆;当有n-2个盘在A杆时,上述两步的移动数就变成了n-3;……;以此类推,当剩下2个盘在A杆时,第一步就是把2-1=1个盘移动到B杆,然后把剩下的1个盘从A杆移动到C杆,最后再把B杆上的一个盘移到C杆;当剩下一个盘在A杆时,就是只有一步操作了,直接从A杆移动到C杆!

def TowerOfHanoi(n, a, b, c):
    if n == 1:
        print(a, '-->', c)
    else:
        TowerOfHanoi(n - 1, a, c, b)
        TowerOfHanoi(1, a, b, c)
        TowerOfHanoi(n - 1, b, a, c)

猜你喜欢

转载自blog.csdn.net/m0_37570217/article/details/80292157