降序Fibonacci数的递归

时间:2015-12-15 11:27:57

标签: c recursion fibonacci

我很难理解降序Fibonacci数的递归,试图手工评估,但没有成功。

在评估代码时,我认为它将从以下开始: (5,1,2)

然而,它始于: (1,8,13) (2,5,8)等等

我完全迷失在这里。有人可以解释为什么它会这样工作吗?

#include <stdio.h>
#include <stdlib.h>


void fib_dec_a ( int n, int f1, int f2 ) {
    if ( n > 1 ){
        fib_dec_a ( n - 1, f2, f1 + f2 );
    }
    printf ("%d\n", f1);
}

int main () {
     int n;
     printf ( "Enter the length of descending Fibonacci sequence: " );
     scanf ( "%d", &n);
     printf ( "\nDescending sequence starting with an n-th element %d :\n", n );
     fib_dec_a (n, 1, 1 );
     return 0;
}

对于n = 6: 8 五 3 2 1 1

2 个答案:

答案 0 :(得分:0)

fib_dec_a是一个阻止通话;只有在该函数完成它必须执行的任何指令后,执行才会继续。因此,为了达到n == 1案例,必须首先完成n == 2案例。这同样适用于n == 3案例; n == 4案例必须先完成执行。

因此,printf的较低值的所有n语句将首先执行,因为它们的被调用者(n + 1)在执行之前等待它返回。如果您将printf语句移到if (n > 1)分支上方,则会发现订单已被撤消。

答案 1 :(得分:0)

直到n> 1,这些函数被递归调用; f(6,1,1) -> f(5,1,2) -> f(4,2,3) -> f(3,3,5) -> f(2,5,8) -> f(1,8,13

for f(1,8,13) => f1 = 8

然后所有函数以相反的方式完成日志记录命令运行,8,5,3,2,1,1。