【问题标题】:Fibonacci sequence C problems [closed]斐波那契数列 C 问题
【发布时间】:2021-06-25 19:10:41
【问题描述】:

我正在解决这个问题...但是我不知道为什么当输入大于 200 的数字时它会变成无限循环。我使用了递归函数。而我也只能使用这个功能。我该怎么办?

#include <stdio.h>
int f(int n){   
    if (n<=0) return 0;
    else if(n==1 || n==2) return 1; 
    else {
        return f(n-1)+f(n-2);
    }
}

int main()    
{   
   int n;
   scanf("%d", &n);
   printf("%d", f(n));
   return 0;
}

【问题讨论】:

  • 因为int这个数字太大了
  • 符合int 的最大斐波那契数是n=46
  • 其实这不是一个无限循环,它只是一个非常非常长的循环。计算斐波那契数是一个经典示例(可能是经典示例),说明何时应该使用递归(至少,不能没有memoization)。
  • 对于 n=46,我的计算机(一台速度相当快的现代笔记本电脑)需要 10 多秒才能(正确)计算出值 1836311903。对于 n=200,我估计需要 9,203,321,947,172,577,060,265,858 年。
  • @SteveSummit 只有几十亿个宇宙的生命周期。你赶时间吗?

标签: c


【解决方案1】:

……它变成了一个无限循环。

如果您通过等待程序完成来判断程序是否处于无限循环中,那么除非您永远等待,否则您无法区分它处于非常长的循环中还是处于无限循环中,我怀疑您是否有完成。

当您请求f(200) 时,对f 的调用将评估f(199)f(198)。然后对f 的第一个调用评估f(198)f(197),第二个评估f(197)f(196)。当您跟踪此调用树时,大约有 1041 个调用涉及。所以你的程序在你等待的时候永远不会终止,因为评估这么多的调用需要很长时间。

(给定输入 n 的调用次数将非常类似于 n 的斐波那契数列,并且数字之间的比率接近 (1+sqrt (5))/2,因此调用次数约为 (1+sqrt(5)/2)n 倍于某个常数,具体取决于初始项。)

【讨论】:

    猜你喜欢
    • 2011-05-19
    • 2010-11-24
    • 2015-06-05
    • 1970-01-01
    • 2017-11-18
    • 2013-02-24
    • 2021-11-30
    相关资源
    最近更新 更多