斐波那契递归如何工作

时间:2018-10-09 17:36:49

标签: java recursion fibonacci

int fib(int i) {
    if(i<2) {
        return 1;
    }
    else {
        return fib(i-1) + fib(i-2) ;
    }
}

我无法理解如何处理语句返回fib(i-1) + fib(i-2)

fib(i-1)是否先被处理,fib(i-2)还是同时被处理?

此外,假设fib(i-1)=3,然后在这种情况下,fib(i-1)=3的计算方式。.我知道进一步调用了fib(i-1)=2fib(i-1)=1,它们得到了{{1两种情况下都作为回报。然后如何基于1fib(i-1)=3计算fib(i-1)=2

3 个答案:

答案 0 :(得分:0)

类似的东西:

fib(4) = 
fib(3) + fib(2) = 
fib(2) + fib(1) + fib(2) = 
fib(1) + fib(0) + fib(1) + fib(2) = 
1 + fib(0) + fib(1) + fib(2) = 
1 + 1 + fib(1) + fib(2) = 
2 + fib(1) + fib(2) = 
2 + 1 + fib(2) = 
3 + fib(2) = 
3 + fib(1) + fib(0) = 
3 + 1 + fib(0) = 
4 + fib(0) = 
4 + 1 = 
5

没有任何事情可以“同时”执行,它只是多次调用fib,同时评估了您对fib(4)的第一次调用。

答案 1 :(得分:0)

每次遇到语句return fib(i-1) + fib(i-2) ;时,它必须先找出fib(i-1)是什么,然后才知道fib(i-2)是什么。每当我不满足小于2的要求时,都必须转到return fib(i-1) + fib(i-2) ;的实例。然后,它首先寻找fib(i-1)是什么,然后寻找fib(i-2)是什么。如果fib(i-1)是导致它转到else语句的另一个实例的原因,则意味着它将在寻找第一个{之前,先寻找第二个fib(i-1),然后寻找第二个fib(i-2)。 {1}},因为需要这些第二部分来确定第一个fib(i-2)是什么。只要不满足if语句要求,它将继续与else语句一起走得更远。一旦它从if语句得到其第一个1,则它将能够开始填充先前遇到的fib(i-1)fib(i-1)的所有值,直到返回到第一个。 fib(i-2)。只有这样,它才能继续前进到第一个fib(i-1),然后按需要进入if语句,然后再输入这些1,然后将它们加起来以找出第一个fib(i-2)是什么。如果这只会使事情变得更加混乱,我建议使用箭头将其写出来,以显示正在采取的步骤,这样您就可以清楚地知道自己的位置以及所做的一切。这样做对我第一次学习Fibonacci递归时有帮助。

答案 2 :(得分:-1)

fib(4) =                fib(3)                +                   fib(2)

                fib(2)        +       fib(1)     +           fib(1)    +     fib(0)

            fib(1) + fib(0)   +         1        +             1       +       1

              1   +   1       +         1        +             1       +       1     =    5