python递归实现汉诺塔实现

问题描述:古代有一个梵塔,塔内有三个座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

下面是运行结果

《python递归实现汉诺塔实现》

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/qq_35531985/article/details/75208127
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞