鱼C论坛

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

[已解决]哈喽,大神们,小弟在递归上面遇到了问题

[复制链接]
发表于 2018-10-17 18:09:00 | 显示全部楼层 |阅读模式

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

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

x

                               
登录/注册后可看大图
关于10禁止转换为2禁止的题目

小弟的代码是这样的,有问题:
def name():
    string=''
    def digui(x):
        nonlocal string
        if x<2:
            return 0
        else:
            a=x%2
            string=string+str(a)
            x=x//2
            digui(x)
            string=string[::-1]
            return string
    return digui
        
小甲鱼老师的代码是这样的
def Dec2Bin(dec):
    result = ''
   
    if dec:
        result = Dec2Bin(dec//2)
        return result + str(dec%2)
    else:
        return result

print(Dec2Bin(777))


我有个问题 dec2bin这个 函数调用自己本身?那不是要经过 result=‘’ 那之前的 result 在递归过程 中 不应 该会被清理掉么
每次递归 不是应该相当于重新定义一次 result这个变量么?

最佳答案
2018-10-17 19:34:47
xzx1 发表于 2018-10-17 19:00
就是我搞不懂我代码的BUG在哪 我的代码输出结果 少了一位 我这样不算递归么?
既然递归输出结果是 反向 ...
  1. def name():
  2.     string=''
  3.     def digui(x):
  4.         nonlocal string
  5.         if x == 0:   #结束的边界错了
  6.             return 0
  7.         else:
  8.             string = string+str(x%2)
  9.             digui(x//2)
  10.             return string[::-1]
  11.     return digui

  12. a = name()
  13. print(a(777))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-10-17 18:09:49 | 显示全部楼层
而且 这个 递归 是从 最后一层开始往上递归的么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-17 18:30:10 | 显示全部楼层
递归看你要从头或尾开始都可以,但输出是反向的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-17 18:31:46 | 显示全部楼层
这个result不会被回收的原因是,在不同的函数中调用的,这个涉及到了对象的知识, 就好像       人都是一个鼻子两个眼睛,     但是  如果你说小甲鱼  干这件事 ,干完传给老甲鱼  ,实际上俩边是互不影响的       小甲鱼干事的时候   可能把   一个    A  当作1    老甲鱼    干事   把   A当作2     这两个A是不影响的     
你可以尝试打印这个变量的 ID      就是在赋值语句下面加上     id(result)          可以看到是不一样的

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
xzx1 + 5 + 5 + 3 谢谢

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-17 18:33:44 | 显示全部楼层
在每次初始化重置是正确的,因为每次用的result不是一个result

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
xzx1 + 5 + 5 + 3 谢谢

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-17 18:41:36 | 显示全部楼层
递归一直生成局部变量,每一次都会初始化一次,但是是子层的 result。重点在于  return result + str(dec%2) 把计算结果返回给父层,那么所有的结果才会串在一起
要不然 dec % 2 不是 0 就是 1,怎么会是一个字符串呢?

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
xzx1 + 5 + 5 + 3 谢谢

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-17 19:00:00 | 显示全部楼层
claws0n 发表于 2018-10-17 18:41
递归一直生成局部变量,每一次都会初始化一次,但是是子层的 result。重点在于  return result + str(dec%2 ...

就是我搞不懂我代码的BUG在哪 我的代码输出结果 少了一位 我这样不算递归么?
既然递归输出结果是 反向的 为何 我再加了一个string=string[::-1 ]以后就只是少了一位数值而不是 又少一位数值又 是一个反着的答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-17 19:34:47 | 显示全部楼层    本楼为最佳答案   
xzx1 发表于 2018-10-17 19:00
就是我搞不懂我代码的BUG在哪 我的代码输出结果 少了一位 我这样不算递归么?
既然递归输出结果是 反向 ...
  1. def name():
  2.     string=''
  3.     def digui(x):
  4.         nonlocal string
  5.         if x == 0:   #结束的边界错了
  6.             return 0
  7.         else:
  8.             string = string+str(x%2)
  9.             digui(x//2)
  10.             return string[::-1]
  11.     return digui

  12. a = name()
  13. print(a(777))
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
xzx1 + 5 + 5 + 3 这已经是您耐心回答我的第三个问题了谢谢!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 02:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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