经典的递归问题,为了给自己疏一遍原理,整理一下思路,写一下这篇文章。
简单情况:输出移动步骤
def hanoi(n,a,b,c):
if n==1:
print(a,'-->',c)
else:
hanoi(n-1,a,c,b)#把a柱上的n-1个盘子借助c移动到b柱
print(a,'-->',c)#把a柱上底盘移动到c柱
hanoi(n-1,b,a,c)#把b柱上的n-1个盘子借助a移动到c柱
递归也类似与栈,最先调用函数的那遍最后实现。
以3个盘子的汉诺塔为例,最小盘的序号为1,依次增加。
把a柱上的1,2两个盘子借助c移动到b柱:
1:a–>c
2:a–>b
1:c–>b
把3由a移动到c:
3:a–>c
把b柱上的1,2两个盘子借助a移动到c柱:
1:b–>a
2:b–>c
3:a–>c
这是在pycharm里debug的一小段过程,也让我稍稍加深了对递归的理解,递归的实现就是栈的调用,先执行else语句下的第一句话,每次n-1都进栈一次,直到满足if的条件,然后出栈一次做print语句,然后在第三句再递归,再进栈,再出栈。
(a,c,b)和(b,a,c)都是换一下柱子,为了让最底层的盘顺利进入目标柱子。
稍加一步:输出移动步骤及步数
print(2**n-1)
def num(x):
if num==1:
return 1
else:
return 2*num(x-1)+1
或者用一个全局变量记录次数
def hanoi(n,a,b,c):
count=0
if n==1:
print(a,'-->',c)
return 1
else:
count+=hanoi(n-1,a,c,b)
count+=hanoi(1,a,b,c)
count+=hanoi(n-1,b,a,c)
return count
分别表示出每种情况出现过的次数
n=int(input())#n为盘子总数
ab =0
ac =1
ba =0
bc =0
ca =0
cb =0
for i in range(1,n):
ab1=ab+ac
bc1=ab1
ca1=ba+cb
ba1=ab+ca
cb1=ca1
ac1=2**(i+1)-1-(ab1+bc1+ca1+ba1+cb1)
ab=ab1
ac=ac1
ba=ba1
bc=bc1
ca=ca1
cb=cb1
print("A->B:%d"%(ab))
print("A->C:%d"%ac)
print("B->A:%d"%ba)
print("B->C:%d"%bc)
print("C->A:%d"%ca)
print("C->B:%d"%cb)