利用汉诺塔游戏理解Python中递归思想

本文通过汉诺塔游戏介绍如何理解Python中的递归思想。从移动一个盘子开始,逐步增加难度,揭示了当盘子数量增加时,问题可以分解为更小规模的汉诺塔游戏。最后,给出了利用递归实现汉诺塔游戏的Python代码,阐述递归在简化逻辑和避免重复代码方面的作用。
摘要由CSDN通过智能技术生成

利用汉诺塔游戏理解Python中递归思想

汉诺塔游戏详细大家都玩过,那么我们就不多废话,直接进入我们的正题,利用该游戏理解Python中的递归思想。
汉诺塔游戏的规则
规则一:大盘子不能放到小盘子的上面;
规则二:每次只能移动一个盘子。
方法思路
在编程开始之前,我们不妨先简单的玩一玩这个游戏,由简单到复杂,我们先尝试移动一个盘子:

#我们假设盘子的数量为n,另外塔我们分别用:a,b,c进行编号
#当盘子的数量为1时,即n==1,那么我们直接把盘子从a拿到c就完成了

#定义函数以及包含的参数
def hanuo(n,a,b,c):
if n==1:
    print(a,"-->",c)#将盘子从a直接移动到c
    return None

如果你能够理解以上内容,那我们就继续增加难度,往下进行,当盘子的数量为2的时候:

 if n==2:
        print(a,"-->",b)#将小盘子从a移动到b进行存放
        print(a,"-->",c)#将大盘子从a移动到c上
        print(b,"-->",c)#再将小盘子从b移动到c上,完成游戏
        return None

其实到此时我们已经不难发现这样一个规律,当最后一个盘子移动到C的时候,我们暂存在B上的盘子是否可以理解为一个新的汉诺塔游戏开始了呢?我们不妨继续增加游戏难度,当盘子数量为3的时候,验证我们的猜想!

我们把小盘子放到塔B上进行暂存,并且将第二个盘子放到C上
在这里插入图片描述
接下来,我们把最小的盘子放到C上,为了节省大家时间,我们通过一顿操作,直接达到了如下这种状态:
在这里插入图片描述
是的!当最大的一个盘子移动到C上的时候,我们可以认为,此时开始了一个移动2个盘子的汉诺塔游戏,当中号的盘子也移动到C的时候,我们也认为,此时我们开始了一个盘子的汉诺塔游戏!
发现了这样的规律以后,我们就继续我们未完成的Python代码:

       #我不用知道前边n-1个盘子该怎么移动才能按顺序放到b上
       #但是我确定的是,计算机会帮我把n-1个盘子拆解为n-2个盘子的游戏完成上面的操作
       
        hanuo(n-1,a,c,b)          #我们把n-1个盘子借助塔C,移动到塔B上
        print(a,"-->",c)          #将最后一个盘子从A转移到C
        hanuo(n-1,b,a,c)          #将b上的n-1个盘子,通过a转移到c上
        
        #最后一步,将B塔上的n-1个盘子,借助A塔,移到C塔上完成游戏
        hanuo(n-1,b,a,c)#将b上的n-1个盘子,通过a转移到c上 

完整代码如下:

global n
def hanuo(n,a,b,c):
    if n==1:
        print(a,"-->",c)
        return None
    if n==2:
        print(a,"-->",b)
        print(a,"-->",c)
        print(b,"-->",c)
        return None
    hanuo(n-1,a,c,b)#将最后一个盘子从a转移到c,调用递归
    print(a,"-->",c)
    hanuo(n-1,b,a,c)#将b上的n-1个盘子,通过a转移到c上,调用递归


a = "A" #命名塔的名称
b = "B"
c = "C"
n = input("请输入盘子的数量:")
n = int(n)
print("您总共需要移动{}步".format(2**n-1))
print("步骤如下:")
hanuo(n,a,b,c)    

总结:
利用递归思想,我们可以避免出现大量重复的代码,一方面节省程序猿们宝贵的周末休息时间,另一方面,也避免了层层嵌套的逻辑混乱,方便理解。脏活累活就交给机器去处理吧!

以上便是全部内容,我是一名没有任何编程基础的Python小白。初识Python不久,其中不乏有许多错误,希望大家能给我指出错误!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值