鱼C论坛

 找回密码
 立即注册
查看: 3783|回复: 7

[已解决]怎么对汉诺塔问题的移动次数进行计数?

[复制链接]
发表于 2020-3-24 09:58:10 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 环境过程发明家 于 2020-3-24 10:00 编辑

如题,想在小甲鱼老师写的汉诺塔递归程序上添加统计移动次数的功能(知道次数可以直接打印最终结果2^n-1,但是还是想通过逐次计数来得出结果)
现在写的程序是这样的
time=0
def hanoi(n,start,media,target):
    global time
    if n == 1:
        print(start,"--->",target)
        time+=1
    else:
        hanoi(n-1,start,target,media)
        print(start,"--->",target)
        time+=1
        hanoi(n-1,media,start,target)
    return(time)


多次运行时,第一次能得出正确结果(7),第二次以后打印的次数则是在第一次基础上进行的累加(14)(如图)。请问这个程序要怎样修改呢?
pic1.jpg
最佳答案
2020-3-24 11:12:13
  1. def hanoi(n,start,media,target):
  2.     time=0
  3.     if n == 1:
  4.         print(start,"--->",target)
  5.         time+=1
  6.     else:
  7.         time+=hanoi(n-1,start,target,media)
  8.         print(start,"--->",target)
  9.         time+=1
  10.         time+=hanoi(n-1,media,start,target)
  11.     return(time)
  12.    
  13. print(hanoi(3,'a','b','c'))
  14. print(hanoi(3,'a','b','c'))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-24 10:20:00 | 显示全部楼层
在函数第二行加一句:
  1. time = 0
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-24 10:47:19 | 显示全部楼层
TCY 发表于 2020-3-24 10:20
在函数第二行加一句:

你那样不行,每次递归都会被重置
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-24 11:12:13 | 显示全部楼层    本楼为最佳答案   
  1. def hanoi(n,start,media,target):
  2.     time=0
  3.     if n == 1:
  4.         print(start,"--->",target)
  5.         time+=1
  6.     else:
  7.         time+=hanoi(n-1,start,target,media)
  8.         print(start,"--->",target)
  9.         time+=1
  10.         time+=hanoi(n-1,media,start,target)
  11.     return(time)
  12.    
  13. print(hanoi(3,'a','b','c'))
  14. print(hanoi(3,'a','b','c'))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-24 11:24:14 | 显示全部楼层
不能使用全局变量。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-24 13:09:52 | 显示全部楼层
可以使用闭包解决:

  1. def func(n, s, m, t):
  2.     time = 0

  3.     def hanoi(n, start, media, target):
  4.         nonlocal time
  5.         if n == 1:
  6.             print(start, "--->", target)
  7.             time += 1
  8.         else:
  9.             hanoi(n - 1, start, target, media)
  10.             print(start, "--->", target)
  11.             time += 1
  12.             hanoi(n - 1, media, start, target)
  13.         return time

  14.     return hanoi(n, s, m, t)


  15. print(func(3, "a", "b", "c"))
  16. print(func(3, "a", "b", "c"))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-3-24 15:49:30 | 显示全部楼层

time+=hanoi(n-1,start,target,media)
这句没看懂  能解释一下嘛 谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-24 15:57:31 | 显示全部楼层
环境过程发明家 发表于 2020-3-24 15:49
time+=hanoi(n-1,start,target,media)
这句没看懂  能解释一下嘛 谢谢


time+=hanoi(n-1,start,target,media)
就是
time = time + hanoi(n-1,start,target,media)
函数的返回值是移动的次数,这句话就是把递归调用时所计数的次数返回来与本次调用的计数值相加。
也就是把多层递归中移动的次数相加。
不太理解的话,可以这样写,或许更好理解。
  1. def hanoi(n,start,media,target):
  2.     time=0
  3.     if n == 1:
  4.         print(start,"--->",target)
  5.         time+=1
  6.     else:
  7.         t1=hanoi(n-1,start,target,media)
  8.         time =time+t1
  9.         print(start,"--->",target)
  10.         time+=1
  11.         t2=hanoi(n-1,media,start,target)
  12.         time=time+t2
  13.     return(time)
  14.    
  15. print(hanoi(3,'a','b','c'))
  16. print(hanoi(3,'a','b','c'))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 03:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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