鱼C论坛

 找回密码
 立即注册
查看: 3920|回复: 14

[已解决]关于汉诺塔里求次数的一个print的小问题

[复制链接]
发表于 2018-9-4 13:33:44 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 ChuckCheng 于 2018-9-4 13:35 编辑

看了汉诺塔的视频,想求求每次递归的次数,程序没问题,有个小问题是关于,print的,为什么直接把函数写在print里,显示的次数会是正确的两倍??这是为什么
t=0
def hanoi(n,x,y,z):
   
    global t
   
    if n==1:
      
        t+=1
        #print(x,'->',z)##只有一个盘子时直接移动到第三个盘子
    else:
        hanoi(n-1,x,z,y)##假设已经将所有前n-1个盘子移动y以后
      
        t+=1
        #print(x,'->',z)###将最后一个盘子移动到第三个柱子
        hanoi(n-1,y,x,z)##然后将前面n-1个盘子从中间的柱子y移动到第三根柱子上
   
    return t
f=hanoi(3,'x','y','z')
print('共计需要%d步' %hanoi(3,'x','y','z')) ## 显示为14步,正确答案的2倍
print(f)#3显示正确答案7步
print('共计需要%d步' %f)##显示7步
最佳答案
2018-9-5 14:37:48
FC的注册很坑 发表于 2018-9-4 14:27
因为做了2遍啊,你把f=hanoi(3,'x','y','z')注释掉,直接print('共计需要%d步' %hanoi(3,'x','y','z'))就是 ...

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

使用道具 举报

发表于 2018-9-4 13:41:24 | 显示全部楼层

回帖奖励 +3 鱼币

7 步 ?
1.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-9-4 14:16:06 | 显示全部楼层

你把程序中的print的#删了·····你不要删,返回的的t就是 递归的次数

我把##删了以后,跑出来的结果如下
x -> z
x -> y
z -> y
x -> z
y -> x
y -> z
x -> z
x -> z
x -> y
z -> y
x -> z
y -> x
y -> z
x -> z
共计需要14步(这里还是显示14步,不理解)
7
共计需要7步
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-4 14:18:01 | 显示全部楼层

问题出在print('共计需要%d步' %hanoi(3,'x','y','z'))打出来是14
print('共计需要%d步' %f)打出来是7,这就是我疑惑的地方,,实际就是7个移动完成汉诺塔··
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-4 14:27:25 | 显示全部楼层
本帖最后由 FC的注册很坑 于 2018-9-4 14:28 编辑

因为做了2遍啊,你把f=hanoi(3,'x','y','z')注释掉,直接print('共计需要%d步' %hanoi(3,'x','y','z'))就是7步
因为t=0是在上面的
f=hanoi(3,'x','y','z')调用了一遍,t=7了
然后print里又调用了一遍,在t=7的基础上又加了7次,所以就是14了
而直接print(f)就是第一次的t=7,所以输出是7
就是每次的调用没有把t还原成t=0
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-9-4 14:29:07 | 显示全部楼层
你将“print('共计需要%d步' %hanoi(3,'x','y','z')) ”中的%hanoi(3,'x',;y','z')改为%f,因为访问的次数多了一倍,输出的次数就多了一倍
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-4 14:34:03 | 显示全部楼层
ChuckCheng 发表于 2018-9-4 14:18
问题出在print('共计需要%d步' %hanoi(3,'x','y','z'))打出来是14
print('共计需要%d步' %f)打出来是7, ...

哈哈,明白您的问题了。因为 global t 。你在 print 调用 hanoi(),会计算多一次。所以是 print('共计需要%d步' %f)。
global + 再次调用函数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-4 15:03:07 | 显示全部楼层
claws0n 发表于 2018-9-4 14:34
哈哈,明白您的问题了。因为 global t 。你在 print 调用 hanoi(),会计算多一次。所以是 print('共计需 ...

谢谢~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-4 16:25:58 | 显示全部楼层

处理问题我喜欢尽可能的简单化,我用的是sum的方式,很好处理哦。

s = 0
def hanoi(n,x,y,z):
    global s
    i = 0
    if n == 1:
        print(x,'-->',z)
        i += 1
    else:
        hanoi(n-1,x,z,y)#将前n-1个盘子从x移动到y上
        print(x,'-->',z)#将最底层的最后一个盘子从x移动到z上
        hanoi(n-1,y,x,z)#将y上的n-1个盘子移动到z上
        i += 1
    s = s + i
n = int(input('请输入汉诺塔的层数:'))
hanoi(n,'A','B','C')
print(s)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-4 20:11:47 | 显示全部楼层
claws0n 发表于 2018-9-4 14:34
哈哈,明白您的问题了。因为 global t 。你在 print 调用 hanoi(),会计算多一次。所以是 print('共计需 ...

请问一个问题,如果我如那样连续多次调用函数,可是全局变量t却无法清0,这样每次得的递归次数都是累计,有没有办法修改,保证每次计算出的递归次数就是当下的递归次数·····
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-4 20:12:42 | 显示全部楼层
geen 发表于 2018-9-4 16:25
处理问题我喜欢尽可能的简单化,我用的是sum的方式,很好处理哦。

s = 0

连续调用两次函数,s还是会是两次调用的递归次数之和,并非的单次调用的次数,有能修改一下吗···
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-5 00:18:03 | 显示全部楼层
ChuckCheng 发表于 2018-9-4 20:11
请问一个问题,如果我如那样连续多次调用函数,可是全局变量t却无法清0,这样每次得的递归次数都是累计, ...
  1. def hanoi(n, x = 'x', y = 'y', z = 'z'):
  2.     count = 0               #必须先有一个局部变量
  3.     def hanoi_counter(n, x, y, z):        #函数的封装
  4.         nonlocal count    #改用 nonlocal 非局部变量
  5.         count += 1
  6.         if n == 1:
  7. ##            print(x +' -> '+ z)
  8.             return count
  9.         else:
  10.             hanoi_counter(n-1,x,z,y)
  11. ##            print(x +' -> '+ z)
  12.             hanoi_counter(n-1,y,x,z)
  13.     hanoi_counter(n,x,y,z)        #这里要调用才会启动计数
  14.    
  15.     return count    #返回计数结果

  16. print('testing\n')
  17. for i in range(1,5):
  18.     print('final result',hanoi(3))
复制代码
1.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-5 14:37:48 | 显示全部楼层    本楼为最佳答案   
FC的注册很坑 发表于 2018-9-4 14:27
因为做了2遍啊,你把f=hanoi(3,'x','y','z')注释掉,直接print('共计需要%d步' %hanoi(3,'x','y','z'))就是 ...

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

使用道具 举报

 楼主| 发表于 2018-9-5 16:41:57 | 显示全部楼层

谢谢,厉害,够学习了··很多东西
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-5 16:47:01 | 显示全部楼层
ChuckCheng 发表于 2018-9-5 16:41
谢谢,厉害,够学习了··很多东西

记得采纳最佳答案哦~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-5 03:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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