c - 如何更快地生成斐波那契

标签 c algorithm fibonacci

<分区>

我是一名 CSE 学生,正在为编程竞赛做准备。现在我正在研究斐波那契数列。我有一个大小约为几千字节的输入文件,其中包含正整数。输入甲酸看起来像

3 5 6 7 8 0

零表示文件结束。输出应该像

2 
5 
8 
13 
21 

我的代码是

#include<stdio.h>

int fibonacci(int n) {
  if (n==1 || n==2)
    return 1;
  else
    return fibonacci(n-1) +fibonacci(n-2);
}
int main() {
  int z;
  FILE * fp;    
  fp = fopen ("input.txt","r");    
  while(fscanf(fp,"%d", &z) && z) 
   printf("%d \n",fibonacci(z));
  return 0;
}

该代码适用于样本输入并提供准确的结果,但问题是我的真实输入集花费的时间超过了我的时间限制。谁能帮帮我。

最佳答案

如果内存有限,您可以简单地使用返回最后两个斐波那契数的函数的尾递归版本。

int fib(int n)
{
    int a = 0;
    int b = 1;
    while (n-- > 1) {
        int t = a;
        a = b;
        b += t;
    }
    return b;
}

这是 O(n) 并且需要一个常量空间。

关于c - 如何更快地生成斐波那契,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3337455/

相关文章:

c - 当用类型声明指针时,这怎么能取消引用 ‘void *’ 呢?

c - 通过 typedef 对数组私有(private)的结构内容的错位可能性

algorithm - 允许共享开始/结束顶点的有向最大加权二分匹配

Scala 单位类型,斐波那契递归深度函数

c - 线程中的线程?

c - 单独使用递归构建最小堆

algorithm - 从彩色背景中检测黑点

javascript - 为什么 Math.abs 比 Math.round 花费的时间长得多?

java - 以最少的运行时间存储带递归的斐波那契数列的值

c - 以下两个 C 程序(迭代和归纳)中哪一个对于查找第 n 个斐波那契数更有效?