鱼C论坛

 找回密码
 立即注册
查看: 3621|回复: 10

[已解决]每周一练第十四期:汉诺塔

[复制链接]
发表于 2022-11-5 11:29:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 漫星闪 于 2022-11-5 12:00 编辑

大家好,今天是每周一练第十四期。
这次的每周一练由我帮助用户@高山  发帖
题目名称:三环汉诺塔
题目说明:在一根柱子上从下往上按照大小顺序摞着3片黄金圆盘,需要移动圆盘。圆盘从下面开始按大小顺序重新摆放在另一根柱子上.任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
思路提示:递归方法
程序代码:
游客,如果您要查看本帖隐藏内容请回复
[/hide]
为了学习zhuangjinxuan同学,我也把把帖子设置成了问题求助,效率高的代码将会被评为最佳答案!所以请踊跃回答哦
最佳答案
2022-11-5 13:07:06
  1. '''
  2. 汉诺塔个数>1,即至少有两个
  3. 从上往下对盘标号为1~n
  4. 对于2的情况,把1从A移到B,再把2从A移到C,最后把1从B移到C
  5. 对于n>2我们把第n个,因为最大,可以看做底盘,所以只需要把1~n-1从A移到B,再把n从A移到C,最后把1~n-1从B移到C
  6. 这样就形成了递归关系,代码如下
  7. 注意不要被ABC误导了,我们的最终目标是以A为起点,B为中介,C为终点;而在移动1~n-1时,A是起点,C是中介,B是终点。ABC只是代表地点而已
  8. '''


  9. def move (n, from_, to):
  10.     print(f"move {n} from {from_} to {to}")



  11. def hano(n, A, B, C):
  12.     '''
  13.     n: 个数
  14.     A: 起点
  15.     B: 中介
  16.     C: 终点
  17.     '''
  18.     if n==2:
  19.         move(n-1, A, B)
  20.         move(n, A, C)
  21.         move(n-1, B, C)
  22.     else:
  23.         hano(n-1, A, C, B)
  24.         move(n, A, C)
  25.         hano(n-1, B, A, C)


  26. hano(5, 'A', 'B', 'C')


  27. # 2.步数的计算
  28. '''
  29. f(n)=f(n-1) + 1 + f(n-1)
  30. 即 f(n)=2f(n-1)+1
  31. 构造为 f(n)+1=2[f(n-1)+1]
  32. 用等比数列计算得到f(n)的通项公式 f(n)=2**n - 1


  33. 或者move函数 加个计步的全局变量,move一下加一下
  34. '''
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-5 13:07:06 | 显示全部楼层    本楼为最佳答案   
  1. '''
  2. 汉诺塔个数>1,即至少有两个
  3. 从上往下对盘标号为1~n
  4. 对于2的情况,把1从A移到B,再把2从A移到C,最后把1从B移到C
  5. 对于n>2我们把第n个,因为最大,可以看做底盘,所以只需要把1~n-1从A移到B,再把n从A移到C,最后把1~n-1从B移到C
  6. 这样就形成了递归关系,代码如下
  7. 注意不要被ABC误导了,我们的最终目标是以A为起点,B为中介,C为终点;而在移动1~n-1时,A是起点,C是中介,B是终点。ABC只是代表地点而已
  8. '''


  9. def move (n, from_, to):
  10.     print(f"move {n} from {from_} to {to}")



  11. def hano(n, A, B, C):
  12.     '''
  13.     n: 个数
  14.     A: 起点
  15.     B: 中介
  16.     C: 终点
  17.     '''
  18.     if n==2:
  19.         move(n-1, A, B)
  20.         move(n, A, C)
  21.         move(n-1, B, C)
  22.     else:
  23.         hano(n-1, A, C, B)
  24.         move(n, A, C)
  25.         hano(n-1, B, A, C)


  26. hano(5, 'A', 'B', 'C')


  27. # 2.步数的计算
  28. '''
  29. f(n)=f(n-1) + 1 + f(n-1)
  30. 即 f(n)=2f(n-1)+1
  31. 构造为 f(n)+1=2[f(n-1)+1]
  32. 用等比数列计算得到f(n)的通项公式 f(n)=2**n - 1


  33. 或者move函数 加个计步的全局变量,move一下加一下
  34. '''
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2022-11-5 13:40:29 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-5 13:57:02 | 显示全部楼层

再看情况,如果没有人的话就设你是最佳答案了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-5 14:27:24 | 显示全部楼层
  1. def hanoi(n, x = 'x', y = 'y', z = 'z'):
  2.     if n == 1:
  3.         print(x, '->', z)
  4.         return
  5.     hanoi(n-1, x, z, y)
  6.     print(x, '->', z)
  7.     hanoi(n-1, y, x, z)

  8. hanoi(int(input()))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-5 15:03:11 | 显示全部楼层
zhangjinxuan刚刚发13期,你就14啦?并且,你是5号,他是2号,因该是3号(元豪)发帖
查询发帖序号
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-5 16:55:16 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-5 16:55:47 | 显示全部楼层
谁让你发的?
第二次不按轮班表了吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-8 19:15:48 | 显示全部楼层
上一期???我又被遗忘了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-9 18:08:49 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-14 15:27:28 | 显示全部楼层
上一篇,下一篇
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-11 03:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表