【问题标题】:Recursion for descending Fibonacci numbers递减斐波那契数的递归
【发布时间】:2015-12-15 11:27:57
【问题描述】:

我很难理解递减斐波那契数的递归,试图手动评估它但没有成功。

在评估代码时,我认为它会从以下内容开始: (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 5 3 2 1 1

【问题讨论】:

  • 您对此代码有什么具体问题吗?
  • 是的,我不明白上述示例中的递归是如何工作的。我以为它会以 (5, 1, 2) 开头,但事实并非如此,而且似乎以 (1, 8, 13) 开头。
  • 请更新您的问题以更详细地反映这一点,否则它将以“不清楚您在问什么”之类的内容结束

标签: c recursion fibonacci


【解决方案1】:

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

因此,所有用于 n 较低值的 printf 语句将首先执行,因为它们的被调用者 (n + 1) 在执行之前正在等待它返回。如果将printf 语句移到if (n &gt; 1) 分支上方,会发现顺序颠倒了。

【讨论】:

    【解决方案2】:

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

    for f(1,8,13) =&gt; f1 = 8

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

    【讨论】:

      猜你喜欢
      • 2010-12-03
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 2012-11-19
      • 2021-12-01
      • 2016-11-07
      相关资源
      最近更新 更多