汉诺塔问题解决(Python)

经典的递归问题,为了给自己疏一遍原理,整理一下思路,写一下这篇文章。

简单情况:输出移动步骤

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)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值