python实现汉诺塔问题

实训目标

  1. 明确递归函数的递归公式与边界条件
  2. 熟练地定义递归函数

实训分析

我们先来分析一下移动n个圆盘的过程: (1)假设现在 A 柱子上只有 1 个圆盘,此时无需 B 柱子中转而直接将圆盘从 A 柱子移动到 C 柱子上。 (2)假设 A 柱子上有 2 个圆盘,此时可以先将小盘子移动到 B 柱子上,再将大盘子移动到 C 柱子上,最后将小盘子移动到 C 柱子上。我们既可以借助柱子 B 将 2 个盘子从 A 移动到 C,也可以借助 C 将 2 个盘子从 A 移动到 B 。 (3)假设 A 柱子上有 3 个圆盘,则可以根据移动 2 个盘子的过程,先借助柱子 C 将柱子 A 上的两个盘子先移动到柱子B,将A上的大盘子移动到柱子C上,此时 A 成为空柱子,再借助柱子 A,将柱子 B 上两个盘子移动到 C。 (4)以此类推,假设 A 柱子上有 n 个盘子,则可以将 n-1 个盘子看作一个整体,也就是递归中的子问题。例如,借助柱子 C 先将柱子 A 上的 n-1 个盘子移动到柱子 B 上,再将柱子 A 上最大的盘子移动到柱子 C 上,此时 A 成为空柱子,最后借助柱子 A,将柱子 B 上 n-2 个盘子移动到柱子 A 上,将柱子 B 上最大的盘子移动到柱子 C 上,此时 B 成为空柱子......如此往复。 经过上述分析的过程,递归函数边界条件和递归公式分别如下: (1)边界条件:当 n 为 1 时,直接将盘子从A移动到C; (2)递归公式:当 n 为 n 时,直接将 n-1 个盘子先从A移动到空柱子B上,再将第n个盘子移动到柱子C上,最后将柱子B上的 n-1 个盘子移动到柱子C上。

编程要求

根据提示,在右侧编辑器补充代码,实现输出汉诺塔移动过程的功能。

代码测试

运行程序,在控制台输入“1”之后的结果如下所示:

 
  1. 请输入盘子的数量:1
  2. A -> C

再次运行程序,在控制台输入“2”之后的结果如下所示:

 
  1. 请输入盘子的数量:2
  2. A -> B
  3. A -> C
  4. B -> C

再次运行程序,在控制台输入“3”之后的结果如下所示:

 
  1. 请输入盘子的数量:3
  2. A -> C
  3. A -> B
  4. C -> B
  5. A -> C
  6. B -> A
  7. B -> C
  8. A -> C

开始你的任务吧,祝你成功!

def hanoi(n, ch1, ch2, ch3):
    #********** Begin **********
    if n==1 :
        print(ch1,'->',ch3)
    else :
        hanoi(n-1,ch1,ch3,ch2)
        print(ch1,'->',ch3)
        hanoi(n-1,ch2,ch1,ch3)    
    #********** End **********
plate_nums = int(input("请输入盘子的数量:"))
print(plate_nums)
hanoi(plate_nums, 'A', 'B', 'C') 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值