利用汉诺塔游戏理解Python中递归思想
利用汉诺塔游戏理解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不久,其中不乏有许多错误,希望大家能给我指出错误!