python学习笔记 第五章2

经典的汉诺塔问题:
python学习笔记 第五章2
这里我们可以利用递归的思想去做,递归中重要的三步,我们逐条来实现:
1、函数+分支结构
2、递归链条
3、递归基例
函数+分支结构:

def hanoi(n,start,end,mid):
global count
if:
else:

这里我们可以定义一个函数,里面的参数有:一共有n个圆盘,从start柱子移到end柱子,中间柱子为mid。 这里定义一个全局变量来计算移动的步骤数,若为局部变量,会在函数内部不断初始化,所以需要定义全局变量。
递归基例:

if n==1:
print("{}:{}->{}".format(1,start,end))
count=count+1

n=1时,我们只需要一步,既可以从起始点放至结束点。
递归链条:

#else:
hanoi(n-1,start,mid,end)
print("{}:{}->{}".format(n,start,end))
count=count+1
hanoi(n-1,mid,end,start)

我们可以把整个问题看作把n-1个圆盘从start柱子转移到mid柱子,把end柱子看作中间柱子。然后把最下面的圆盘移到end柱子,然后的整个问题就会变成把n-1个圆盘从mid柱子转移到end柱子,把start柱子看作mid柱子,这样,整个问题就会变成下一级的递归问题。问题可看作下图:
python学习笔记 第五章2
我们假设现在的问题为把三个圆盘从A柱子移到C柱子,中间柱子为B。
完整程序为:

#汉诺塔问题
count=0
def hanoi(n,start,end,mid):
global count
if n==1:
print("{}:{}->{}".format(1,start,end))
count=count+1
else:
hanoi(n-1,start,mid,end)
print("{}:{}->{}".format(n,start,end))
count=count+1
hanoi(n-1,mid,end,start)
hanoi(3,“A”,“C”,“B”)
print(count)

结果为:
python学习笔记 第五章2