Python Fibonacci序列的递归

Python Fibonacci序列的递归,python,recursion,fibonacci,Python,Recursion,Fibonacci,我需要一些帮助来理解这里发生的处理过程,所以让我调用fib(5)我想要fibonacci 5,也就是8。但是我的大脑在试图理解算法时说它不是。我(错误地)是这样想的: return fib(4) + fib(3) // Stack frame 1 return fib(3) + fib(1) // Stack frame 2 现在,cause x是1fib(1),如果x==0或x==1,则条件语句将导致递归结束。按照我的逻辑会变成3+1+4+3。请纠正我错误的逻辑 def fib(x):

我需要一些帮助来理解这里发生的处理过程,所以让我调用
fib(5)
我想要fibonacci 5,也就是8。但是我的大脑在试图理解算法时说它不是。我(错误地)是这样想的:

return fib(4) + fib(3) // Stack frame 1
return fib(3) + fib(1) // Stack frame 2
现在,cause x是1
fib(1)
,如果x==0或x==1,则条件语句
将导致递归结束。按照我的逻辑会变成3+1+4+3。请纠正我错误的逻辑

def fib(x):
    """assumes x an int >= 0
       returns Fibonacci of x"""
    assert type(x) == int and x >= 0
    if x == 0 or x == 1:
        return 1
    else:
        return fib(x-1) + fib(x-2)

下面是所发生事情的完整扩展:

fib(5) expands to fib(4)+fib(3)
  fib(4) expands to fib(3)+fib(2)
    fib(3) expands to fib(2)+fib(1)
      fib(2) expands to fib(1)+fib(0)
        fib(1) evaluates to 1
        fib(0) evaluates to 1
      fib(1) evaluates to 1
    fib(2) expands to fib(1)+fib(0)
      fib(1) evaluates to 1
      fib(0) evaluates to 1
  fib(3) expands to fib(2)+fib(1)
    fib(2) expands to fib(1)+fib(0)
      fib(1) evaluates to 1
      fib(0) evaluates to 1
    fib(1) evaluates to 1

如果你数一个,你会得到8作为答案。

对于所有大于1的
x
函数,
fib
函数会自动调用两次:

  • fib(5)
    变成
    fib(4)+fib(3)
  • 并扩展到
    (fib(3)+fib(2))+(fib(2)+fib(1))
  • 并扩展到
    ((fib(2)+fib(1))+(fib(1)+fib(0))+((fib(1)+fib(0))+1)
  • 扩展到
    ((fib(1)+fib(0))+1)+(1+1))+((1+1)+1)
  • 扩展到
    ((1+1)+1)+(1+1))+((1+1)+1)

  • 总共是
    8

    只需在纸上写下第一个调用,并用有效的return语句替换函数的每个递归调用。您可能不理解的是
    返回fib(x-1)+fib(x-2)
    调用两次fib函数,一个参数x=当前x递减一次,另一个递减两次。您可能还应该再次查看函数参数,因为在使用函数时(起初)这是一个典型的误解。只需在函数中放入一些print语句,然后运行它,看看它在做什么。