鱼C论坛

 找回密码
 立即注册
查看: 2100|回复: 4

[已解决]关于汉诺塔的解法打印出的步骤,如何在步骤前加上第几步?

[复制链接]
发表于 2017-10-18 21:11:57 | 显示全部楼层 |阅读模式

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

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

x
  1. ef fab(n):
  2.     if n<1:
  3.         print(' error')
  4.         return -1

  5.     if n ==1:
  6.         return 1
  7.     else:
  8.         return fab(n-1)*2+ 1
  9. i=1
  10. a=1

  11. def hanoi( n,x,y ,z):
  12.     if n==1:
  13.          print (x,'-->',z)
  14.     else:
  15.         hanoi(n-1,x,z,y)#将n-1个盘子从x移动到y上
  16.         #print(x,'-->',z)#将最底下的盘子从x移动成z上
  17.         hanoi(1,x,y,z)
  18.         hanoi(n-1,y,x,z)#将y上的n-1个盘子移动到z上


  19. while i ==1:
  20.     number= int(input('你想玩几个盘子呢:'))
  21.     result =fab(number)
  22.     if result != -1:
  23.         hanoi(number,'A','B','C')
  24.         print ('既然你想玩%d个盘子,我很负责任的告诉你至少要%d步才能完成!.' % (number,result) )      
  25.       
复制代码


我想加入一个变量a进行解法的步数显示
如:
  1. 你想玩几个盘子呢:2
  2. 步骤1:A --> B
  3. 步骤2:A --> C
  4. 步骤3:B --> C
  5. 既然你想玩2个盘子,我很负责任的告诉你至少要3步才能完成!.
复制代码

目前以我的能力 这些步骤几,没有办法实现,请大神指教一下
最佳答案
2017-10-19 00:32:56
mapuboy 发表于 2017-10-18 22:54
用了了你的说全局变量,但是实际的操作中,有一定的问题.
假如并没有买吃input数量后,a没有归零,相同的 ...

他讲的方法是对的,用一个全局变量记录步数,但是记录的方法错了,只要在每次打印前放置a+=1就可以了。
  1. a = 0
  2. def hanoi(n, x, y, z):
  3.     global a
  4.     if n == 1:
  5.         a += 1
  6.         print("步骤%d:"%a , end = '')
  7.         print (x,'-->',z)
  8.     else:
  9.         hanoi(n-1,x,z,y)#将n-1个盘子从x移动到y上
  10.         hanoi(1,x,y,z)
  11.         hanoi(n-1,y,x,z)#将y上的n-1个盘子移动到z上

  12. hanoi(3, 'x', 'y', 'z')
复制代码

步骤1:x --> z
步骤2:x --> y
步骤3:z --> y
步骤4:x --> z
步骤5:y --> x
步骤6:y --> z
步骤7:x --> z
[Finished in 0.1s]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-18 21:30:34 | 显示全部楼层
你需要一个全局变量来存储每次移动的计数
  1. a = 0

  2. def hanoi(n, x, y, z):
  3.     global a
  4.     a += 1
  5.     if n == 1:
  6.         print (x,'-->',z)
  7.     else:
  8.         print("步骤%d:"%a , end = '')
  9.         hanoi(n-1,x,z,y)#将n-1个盘子从x移动到y上
  10.         
  11.         print("步骤%d:"%a , end = '')
  12.         hanoi(1,x,y,z)
  13.         
  14.         print("步骤%d:"%a , end = '')
  15.         hanoi(n-1,y,x,z)#将y上的n-1个盘子移动到z上
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-18 22:54:56 | 显示全部楼层
本帖最后由 mapuboy 于 2017-10-18 23:10 编辑
BngThea 发表于 2017-10-18 21:30
你需要一个全局变量来存储每次移动的计数


用了了你的说全局变量,但是实际的操作中,有一定的问题.
假如并没有买吃input数量后,a没有归零,相同的塔数不一样的步数,对a进行的累积了...
,还有当n==1时并没有打印步骤1:
麻烦您再测试一下,再给我指导一下.
我弄了个a归零的,但是依然会出现:步骤1:步骤2:A --> C
  1. def fab(n):
  2.     if n<1:
  3.         print(' error')
  4.         return -1

  5.     if n ==1:
  6.         return 1
  7.     else:
  8.         return fab(n-1)*2+ 1
  9. i=1
  10. a=0
  11. def hanoi( n,x,y ,z):
  12.     global a
  13.     a += 1
  14.     if n==1:
  15.         print (x,'-->',z)
  16.     else:
  17.         print("步骤%d:"%a , end = '')
  18.         hanoi(n-1,x,z,y)#将n-1个盘子从x移动到y上
  19.         
  20.         print("步骤%d:"%a , end = '')
  21.         hanoi(1,x,y,z)
  22.         
  23.         print("步骤%d:"%a , end = '')
  24.         hanoi(n-1,y,x,z)#将y上的n-1个盘子移动到z上
  25. while i ==1:
  26.     a=0
  27.     number= int(input('你想玩几个盘子呢:'))
  28.     result =fab(number)
  29.     if result != -1:
  30.         hanoi(number,'A','B','C')
  31.         print ('既然你想玩%d个盘子,我很负责任的告诉你至少要%d步才能完成!.' % (number,result) )      
  32.         
  33.    
复制代码

下面是执行效果

  1. 你想玩几个盘子呢:1
  2. A --> C
  3. 既然你想玩1个盘子,我很负责任的告诉你至少要1步才能完成!.
  4. 你想玩几个盘子呢:1
  5. A --> C
  6. 既然你想玩1个盘子,我很负责任的告诉你至少要1步才能完成!.
  7. 你想玩几个盘子呢:2
  8. 步骤1:A --> B
  9. 步骤2:A --> C
  10. 步骤3:B --> C
  11. 既然你想玩2个盘子,我很负责任的告诉你至少要3步才能完成!.
  12. 你想玩几个盘子呢:2
  13. 步骤1:A --> B
  14. 步骤2:A --> C
  15. 步骤3:B --> C
  16. 既然你想玩2个盘子,我很负责任的告诉你至少要3步才能完成!.
  17. 你想玩几个盘子呢:3
  18. 步骤1:步骤2:A --> C
  19. 步骤3:A --> B
  20. 步骤4:C --> B
  21. 步骤5:A --> C
  22. 步骤6:步骤7:B --> A
  23. 步骤8:B --> C
  24. 步骤9:A --> C
  25. 既然你想玩3个盘子,我很负责任的告诉你至少要7步才能完成!.
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-19 00:32:56 | 显示全部楼层    本楼为最佳答案   
mapuboy 发表于 2017-10-18 22:54
用了了你的说全局变量,但是实际的操作中,有一定的问题.
假如并没有买吃input数量后,a没有归零,相同的 ...

他讲的方法是对的,用一个全局变量记录步数,但是记录的方法错了,只要在每次打印前放置a+=1就可以了。
  1. a = 0
  2. def hanoi(n, x, y, z):
  3.     global a
  4.     if n == 1:
  5.         a += 1
  6.         print("步骤%d:"%a , end = '')
  7.         print (x,'-->',z)
  8.     else:
  9.         hanoi(n-1,x,z,y)#将n-1个盘子从x移动到y上
  10.         hanoi(1,x,y,z)
  11.         hanoi(n-1,y,x,z)#将y上的n-1个盘子移动到z上

  12. hanoi(3, 'x', 'y', 'z')
复制代码

步骤1:x --> z
步骤2:x --> y
步骤3:z --> y
步骤4:x --> z
步骤5:y --> x
步骤6:y --> z
步骤7:x --> z
[Finished in 0.1s]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-19 15:42:21 | 显示全部楼层
jerryxjr1220 发表于 2017-10-19 00:32
他讲的方法是对的,用一个全局变量记录步数,但是记录的方法错了,只要在每次打印前放置a+=1就可以了。
...

谢谢你的提点,确实之前上个大神的打印步骤的位置有点问题.
目前我已经懂了
  1. def fab(n):
  2.     if n<1:
  3.         print(' error')
  4.         return -1

  5.     if n ==1:
  6.         return 1
  7.     else:
  8.         return fab(n-1)*2+ 1
  9. i=1
  10. a=0
  11. def hanoi( n,x,y ,z):
  12.     global a
  13.    
  14.    
  15.     if n==1:
  16.         a+=1
  17.         
  18.         print ("步骤%d:"% a ,x,'-->',z)
  19.     else:
  20.         
  21.         hanoi(n-1,x,z,y)#将n-1个盘子从x移动到y上
  22.         
  23.         hanoi(1,x,y,z)#将最后盘子从x移动到y上
  24.         
  25.         hanoi(n-1,y,x,z)#将y上的n-1个盘子移动到z上
  26.         
  27. while i ==1:
  28.    
  29.     number= int(input('你想玩几个盘子呢:'))
  30.    
  31.     result =fab(number)
  32.     if result != -1:
  33.         hanoi(number,'A','B','C')
  34.         print ('既然你想玩%d个盘子,我很负责任的告诉你至少要%d步才能完成!.' % (number,result) )
  35.         a=0
复制代码

供大家也参考一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 00:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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