问题描述:古代有一个梵塔,塔内有三个座A、B、C,A座上有n个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这n个盘子从A座移到B座。
要求:
但每次只能允许移动一个盘子
并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。
如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C,在移动过程中可以利用B座
要求打印移动的步骤。
因为刚学了python中的递归函数,这个题就是练习题,所以实现的方法很明显,要用到递归。
既然要用到递归,就必然要有一个递归的终止条件,比如:在阶乘函数fact(n)的递归中,终止条件为n=1。那么在汉诺塔中,递归的终止条件是什么?
经过手动画图,进行三个盘子的汉诺塔演示时,不难发现,当A座上只有一个盘子时,下一步的操作最为明显,不需要再有递归出现,即将这最后一个盘子,移动到C座上。所以,不难猜测,汉诺塔问题的递归终止条件即是A座上只有一个盘子。
那么是否可以对递归的终止条件,做如下猜测,即不再需要调用递归函数本身时即是递归的终止条件。(欢迎指正)
那么我们可以编写函数代码如下:
# -*- coding: utf-8 -*-
def move(n, a, b, c):
if n == 1:
print('move', a, '->', c)
else:
move(n-1, a, c, b)
move(1, a, b, c)
move(n-1, b, a, c)
代码执行步骤如下
(套用一下python的格式)
当n=3:
#if条件不满足,执行else的语句,先执行第一句:
move(2,a,c,b)
当n=2:
move(1,a,c,b) 即 a—>b
move(1,a,b,c) 即 a—>c
move(1,b,a,c) 即 b—>c
#执行move(1,a,b,c)
move(1,a,b,c) 即 a —> c
#执行else的第三句
move(2,b,a,c)
当n=2:
move(1,b,c,a) 即 b—>a
move(1,b,a,c) 即 b—>c
move(1,a,b,c) 即 a—>c
下面是运行结果