鱼C论坛

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

[已解决]关于digit函数中的return问题?

[复制链接]
发表于 2020-2-29 13:30:10 | 显示全部楼层 |阅读模式

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

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

x
def Dec2Bin(dec):
    result = ''
    if dec:
        result = Dec2Bin(dec // 2)
        return result + str(dec % 2)
    else:
        return result
比如说小甲鱼的这个十进制转二进制问题,在最深一层也就是dec = 0时,会执行return result,平时的return不都是直接返回结果吗?为什么这里不会有‘’的结果输出,然后倒数第2层是return result + str(dec%2),比较抽象,不知道怎么描述问题,其实就是我不太明白在递归中,递归的每一层里面的return是什么意思,我发现递归就是这里把我搞得很糊涂,我对其内部如何执行不太了解。有没有哪位鱼油能给我一些专业+通俗的解释?
最佳答案
2020-2-29 13:47:04
    为了讨论方便,先简化程序代码
  1. def Dec2Bin(dec):
  2.     result = ''
  3.     if dec:
  4.         result = Dec2Bin(dec // 2) + str(dec % 2)
  5.     return result
复制代码

      下面以 Dec2Bin(62) 为例展开讨论

      递归就是函数自己调用自己的行为,递归函数一般都有两个分支,一个有递归,另一个无递归,一开始都有递归,当执行到无递归分支的时候,递归就到底了。以底为界,递归分为进入过程和退出过程。就本例而言,递归的进入过程到 Dec2Bin(0) 也就是 dec = 0 的候到底,并开始有了确切的返回值,不过,这个返回值只是一个空字符串 '',然后,开始了逐级退出的过程,并依次确定了各自的返回值。最后返回字符串 '111110',其实就是从递归到底开始,把各级的递归中的 dec % 2 转化成字符串然后按顺序加在一起得到。
  1. Dec2Bin(62) = Dec2Bin(31) + '0'                                  # Dec2Bin(31) + '0' = Dec2Bin(62)
  2.             = Dec2Bin(15) + '1' + '0'                            # Dec2Bin(15) + '1' = Dec2Bin(31)
  3.             = Dec2Bin( 7) + '1' + '1' + '0'                      # Dec2Bin( 7) + '1' = Dec2Bin(15)
  4.             = Dec2Bin( 3) + '1' + '1' + '1' + '0'                # Dec2Bin( 3) + '1' = Dec2Bin( 7)
  5.             = Dec2Bin( 1) + '1' + '1' + '1' + '1' + '0'          # Dec2Bin( 1) + '1' = Dec2Bin( 3)
  6.             = Dec2Bin( 0) + '1' + '1' + '1' + '1' + '1' + '0'    # Dec2Bin( 0) + '1' = Dec2Bin( 1)
  7.             =      ''     + '1' + '1' + '1' + '1' + '1' + '0'
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-29 13:37:46 | 显示全部楼层
本帖最后由 qiuyouzhi 于 2020-2-29 13:39 编辑

假设输入的数为8

1:
result = Dec2Bin(4 // 2)
2:
result = Dec2Bin(2 // 2)
3:
result = Dec2Bin(1 // 2)
4:
result = Dec2Bin(0 // 2)
返回:
1:
return result + str(4 % 2)
2:
return result + str(2 % 2)
3:
return result + str(1 % 2)
4:
return result + str(0 % 2)
结果为:1000
如果有帮助,请设最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-29 13:47:04 | 显示全部楼层    本楼为最佳答案   
    为了讨论方便,先简化程序代码
  1. def Dec2Bin(dec):
  2.     result = ''
  3.     if dec:
  4.         result = Dec2Bin(dec // 2) + str(dec % 2)
  5.     return result
复制代码

      下面以 Dec2Bin(62) 为例展开讨论

      递归就是函数自己调用自己的行为,递归函数一般都有两个分支,一个有递归,另一个无递归,一开始都有递归,当执行到无递归分支的时候,递归就到底了。以底为界,递归分为进入过程和退出过程。就本例而言,递归的进入过程到 Dec2Bin(0) 也就是 dec = 0 的候到底,并开始有了确切的返回值,不过,这个返回值只是一个空字符串 '',然后,开始了逐级退出的过程,并依次确定了各自的返回值。最后返回字符串 '111110',其实就是从递归到底开始,把各级的递归中的 dec % 2 转化成字符串然后按顺序加在一起得到。
  1. Dec2Bin(62) = Dec2Bin(31) + '0'                                  # Dec2Bin(31) + '0' = Dec2Bin(62)
  2.             = Dec2Bin(15) + '1' + '0'                            # Dec2Bin(15) + '1' = Dec2Bin(31)
  3.             = Dec2Bin( 7) + '1' + '1' + '0'                      # Dec2Bin( 7) + '1' = Dec2Bin(15)
  4.             = Dec2Bin( 3) + '1' + '1' + '1' + '0'                # Dec2Bin( 3) + '1' = Dec2Bin( 7)
  5.             = Dec2Bin( 1) + '1' + '1' + '1' + '1' + '0'          # Dec2Bin( 1) + '1' = Dec2Bin( 3)
  6.             = Dec2Bin( 0) + '1' + '1' + '1' + '1' + '1' + '0'    # Dec2Bin( 0) + '1' = Dec2Bin( 1)
  7.             =      ''     + '1' + '1' + '1' + '1' + '1' + '0'
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-2-29 14:23:01 | 显示全部楼层
jackz007 发表于 2020-2-29 13:47
为了讨论方便,先简化程序代码

      下面以 Dec2Bin(62) 为例展开讨论

谢谢,讲得非常清楚,一下就看明白了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-29 14:26:59 | 显示全部楼层
标题打错了,是递归函数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-1 18:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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