连纵 发表于 2024-8-1 19:07:56

递归函数过程

#递归编写一个十进制转换为二进制的函数
#调用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中,然后一个个添加二进制的字符
递归的运行逻辑不是太懂,求解释

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

学习编程中的Ben 发表于 2024-8-1 19:28:00

因为你先 d2b(d//2) 递归了,又一次运行了程序,要等程序运行完才return

连纵 发表于 2024-8-1 20:20:18

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

对哦,里面在不断调用自身函数,要到返回条件才会出来,了解了

学习编程中的Ben 发表于 2024-8-1 20:30:56

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

给个最佳吧

连纵 发表于 2024-8-1 22:10:10

学习编程中的Ben 发表于 2024-8-1 20:30
给个最佳吧

无需多言,早给了
页: [1]
查看完整版本: 递归函数过程