汉诺塔问题(python代码解析)

欢迎斧正

目录

一、问题描述

二、问题分析

三、代码实现


 

一、问题描述

有A、B、C、三个柱子,其中A上存在N个盘子,从上到下盘子依次增大;先要将盘子移到B上去,但是在移动的过程中,不能出现大盘子在小盘子的上面的情况,C作为辅助;

二、问题分析

图解:

我们可以将问题细分:

1、移动A上N个盘子,我们先移动A上1~N-1个盘子,借助B移到C上去,出现上图中4的那种情况

2、这样A上就剩下了一个最大的盘子,我们将其移到B上去

3、到这问题又回归到了初始情况,只是角色互换了一下(B上面的盘子最大,又是我们最终移动的目标,所以B上那个盘子不要动,相当于没有),就是将C上1~N-1个盘子借助A移动到B

至此可以达到我们的需求

三、代码实现

def f(N, from_d, to_d, help):#函数的三个参数表名题目描述中A为初始,B为目标,C为辅助
    if N == 1:
        print("{} -> {}".format(from_d, to_d))
        return
    f(N-1, from_d, help, to_d)#第一步,以B为辅助移到C,将A上n-1个盘子
    print("{} -> {}".format(from_d, to_d))#第二步,再将A剩下的一个移到B上
    f(N-1, help, to_d, from_d)#第三步,以A为辅助移到B上,将C上n-1即所有的盘子

if __name__ == '__main__':
    f(3, "A", "B", "C")

结果:

A -> B
A -> C
B -> C
A -> B
C -> A
C -> B
A -> B

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值