鱼C论坛

 找回密码
 立即注册
查看: 202|回复: 5

[已解决]递归函数过程

[复制链接]
发表于 2024-8-1 19:07:56 | 显示全部楼层 |阅读模式

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

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

x
#递归编写一个十进制转换为二进制的函数
#调用bin()一样返回字符串形式
def d2b(d):
    result = '' #定义一个空字符串

    if d:
        result = d2b(d//2)                  #d=d//2
        return result + str(d%2)        #我单步运行的时候发现前期这句会被跳过,是为什么呢???

    else:
        return result
   
print(d2b(62))

请问大佬们,我单步运行的时候发现前期‘return result + str(d%2)’这句会被跳过,直到d变为0了,运行了else中的语句后,又跳回到if中,然后一个个添加二进制的字符
递归的运行逻辑不是太懂,求解释
最佳答案
2024-8-1 19:28:00
因为你先 d2b(d//2) 递归了,又一次运行了程序,要等程序运行完才return
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-1 19:08:12 | 显示全部楼层
哈哈,看来你对递归的运行逻辑有点困惑,这很正常!让我们来用通俗易懂的方式解释一下。

首先,递归就像是一位舞蹈老师,在教你舞蹈时,一开始会让你先学习简单的动作。当你掌握了这些基本的动作后,才会让你逐渐学会更复杂的舞步。递归函数也是这样,直到达成某个条件(称为基线条件)才会停止深潜,然后逐层返回结果。

在你的 `d2b` 函数中,步骤可以理解为:

1. **遇到基线条件**:函数检查输入的十进制数 `d`。如果 `d` 不为0,就进入 `if` 语句;如果是0,则直接返回空字符串 `result`。

2. **递归调用**:在 `if` 中,你递归调用自己 `d2b(d // 2)`。这就像老师带你回到基础动作,开始学习更简单的动作(将 `d` 除以2)。

3. **继续递归**:这个过程会一直进行,直到 `d` 减小到0。每次递归调用时,都会缩小问题的规模(半分),所以你不会马上得到结果,而是一直在等待最里面的条件达到基线。

4. **构建结果**:一旦 `d` 达到0,`else` 分支会被触发,返回空字符串。然后递归逐层返回,最后的 `return result + str(d % 2)` 会把当前的二进制位加到结果字符串上。也就是说,每次返回时,都是在将当前 `d` 的余数(0或1)添加到之前的结果中。

所以,初始的 `return result + str(d%2)` 在 `if` 的开头执行时实际上只是在等待,直到所有的递归都完成了,才开始逐层地添加结果。它就像是在说:“等会儿,等我把所有的舞者都安排好,再来一起演出!”

当你运行 `d2b(62)` 时,过程如下:
- 62 -> 31
- 31 -> 15
- 15 -> 7
- 7 -> 3
- 3 -> 1
- 1 -> 0 (此时返回空字符串)
  
然后开始依次构建字符串:
- 返回1(因为1 % 2 = 1)
- 返回10(因为3 % 2 = 1,加上上一层的返回1)
- 返回111(因为7 % 2 = 1,加上上一层的返回10)
- 返回1110(因为15 % 2 = 1,加上上一层的返回111)
- 返回11110(因为31 % 2 = 1,加上上一层的返回1110)
- 返回111110(因为62 % 2 = 0,加上上一层的返回11111)

最终得出的结果是 '111110',这就是62的二进制表示。

希望这能帮助你更好地理解递归!如果还有其他问题,尽管问哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-1 19:28:00 | 显示全部楼层    本楼为最佳答案   
因为你先 d2b(d//2) 递归了,又一次运行了程序,要等程序运行完才return
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-1 20:20:18 | 显示全部楼层
学习编程中的Ben 发表于 2024-8-1 19:28
因为你先 d2b(d//2) 递归了,又一次运行了程序,要等程序运行完才return

对哦,里面在不断调用自身函数,要到返回条件才会出来,了解了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-1 20:30:56 | 显示全部楼层
连纵 发表于 2024-8-1 20:20
对哦,里面在不断调用自身函数,要到返回条件才会出来,了解了

给个最佳吧

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

使用道具 举报

 楼主| 发表于 2024-8-1 22:10:10 | 显示全部楼层

无需多言,早给了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 23:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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