深度递归 (Python)

Ahn*_*naf 2 python recursion return

检查以下代码:

>>> def fib(x):
...    if x == 0 or x == 1:
...        return 1
...    else: 
...        return fib(x-1) + fib(x-2)
>>> print(fib(4))
Run Code Online (Sandbox Code Playgroud)

根据 SoloLearn Python tutorial (for Recursion) 中的注释,代码是这样工作的:

1. fib(4) = fib(3) + fib(2)
2. = (fib(2) + fib(1)) + (fib(1) + fib(0))
3. = fib(1) + fib(0) + fib(1) + fib(1) + fib(0)
4. = 1+ 1 + 1 + 1 + 1
5. = 5
Run Code Online (Sandbox Code Playgroud)

在第 2 行之后,只fib(2)应该去fib()函数的 else 部分,对吗?这两个fib(1)和单个fib(0)满足fib()函数的 if 部分的标准。所以返回 1。我的问题是,为什么在第三行,fib(1) + fib(0) + fib(1) + fib(1) + fib(0)全部替换为 1,然后添加?

请原谅我问这样一个菜鸟问题。

Cop*_*eld 5

这是一个双递归函数,因此它的调用结果是具有 fib(1) 和 fib(0) 基本情况的调用树结构

fib(4) =                  fib(3)          +        fib(2)    
                         /      \                 /     \
fib(4) =        (  fib(2)   +    fib(1) ) + ( fib(1) + fib(0) )    
                  /     \         |              |        |
fib(4) = ( ( fib(1) + fib(0) ) + fib(1) ) + ( fib(1) + fib(0) )    
               |        |          |            |        |
fib(4) = ( (   1    +   1    ) +   1    ) + (   1    +   1    )    
                  \   /            |               \    /
fib(4) = ( (        2        ) +   1    ) + (        2        )    
                        \       /                    |
fib(4) = (                  3           ) + (        2        )    
                                   \             /
fib(4) =                                  5
Run Code Online (Sandbox Code Playgroud)

您还可以通过在正确的位置添加一些打印和一个额外的辅助参数来帮助它和一些其他小的更改来可视化函数的工作

>>> def fib(n, nivel=0):
        if n==0 or n==1:
            print(" "*nivel,"fib(",n,")=1")
            return 1
        else:
            print(" "*nivel,"fib(",n,")")
            result = fib(n-1,nivel+1) + fib(n-2,nivel+1)
            print(" "*nivel,"fib(",n,")=",result)
            return result

>>> fib(4)
 fib( 4 )
  fib( 3 )
   fib( 2 )
    fib( 1 )=1
    fib( 0 )=1
   fib( 2 )= 2
   fib( 1 )=1
  fib( 3 )= 3
  fib( 2 )
   fib( 1 )=1
   fib( 0 )=1
  fib( 2 )= 2
 fib( 4 )= 5
5
>>> 
Run Code Online (Sandbox Code Playgroud)

在这里你可以注意到调用是从左到右和自下而上依次解析的