在C中递归计算Fibonacci数

我正在尝试通过编写一个简单的程序来输出Fibonacci数来学习C. 它不起作用。

fibonacci.h

unsigned int fibonacci_recursive(unsigned int n); 

fibonacci.c

 #include  #include "fibonacci.h" main() { unsigned int i; for (i = 0; i < 10; i++) { printf("%d\t%n", fibonacci_recursive(i)); } getchar(); } 

fibonacci_recursive.c

 unsigned int fib_rec(unsigned int n); main(unsigned int n) { return fib_rec(n); } unsigned int fib_rec(unsigned int n) { if (n == 0) { return 0; } if (n == 1) { return 1; } return fib_rec(n - 1) + fib_rec(n - 2); } 

这是我尝试构建项目时VS 2010给出的错误消息:

 1>ClCompile: 1> fibonacci_recursive.c 1>fibonacci_recursive.obj : error LNK2005: _main already defined in fibonacci.obj 1>fibonacci.obj : error LNK2019: unresolved external symbol _fibonacci_recursive referenced in function _main 1>c:\users\odp\documents\visual studio 2010\Projects\Fibonacci\Debug\Fibonacci.exe : fatal error LNK1120: 1 unresolved externals 1> 1>Build FAILED. 1> 

我在这做错了什么? 感谢您帮助C新手。

你的方法看起来很奇怪,你应该:

  • 一个主文件(例如main.c ),包含main方法,包括fibonacci.h
  • 一个fibonacci.h ,原型unsigned int fibonacci_recursive(unsigned int n);
  • 一个fibonacci.c与该方法的实现,它也应该包括fibonacci.h

实际上你也定义了两次main函数..

main.c中

 #include  #include "fibonacci.h" main() { unsigned int i; for (i = 0; i < 10; i++) { printf("%d\t%n", fibonacci_recursive(i)); } getchar(); } 

fibonacci.h

 unsigned int fibonacci_recursive(unsigned int n); 

fibonacci.c

 #include "fibonacci.h" unsigned int fibonacci_recursive(unsigned int n) { if (n == 0) { return 0; } if (n == 1) { return 1; } return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2); } 

您在项目中定义了两次main()函数。 这是您的程序的入口点,您只需要一个。

你的printf需要\ n而不是%n。 此外,您可以简化为:

 #include "fibonacci.h" unsigned int fibonacci_recursive(unsigned int n) { if (n < 2) return n; else return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2); } 

您尚未创建在fibonacci.h中声明的fibonacci_recursive函数。

您声明了两个main()函数,新行字符为‘\ n’

好吧,我的前言是递归函数不是计算Fibonacci的有效方法,它可能仅用于开发训练/演示目的,因为每个递归都存储在堆栈中,并且它也可能溢出大的fibonacci数。 写下一个使用循环的更有效的Fibonacci函数是值得的,如下面的代码:

 #include  #define MAX_ITERS 20 int fibonacci(int); int main(int argc, char *argv[]) { unsigned int iters; if(argc>1) { iters=atoi(argv[1]); } else iters=MAX_ITERS; fibonacci(iters); return 0; } int fibonacci(int iterations) { unsigned register int i; double first=0.0, second = 1.0, lastsum; printf("First %d iterations of Fibonacci series are :\n",iterations); for ( i = 0 ; i < iterations ; i++ ) { if ( i <= 1 ) lastsum = (double)i; else { lastsum = first + second; first = second; second = lastsum; } printf("%.0f\n",lastsum); } } 

尝试用你自己的方法进行比较,用这种方法运行./fibonacci 50 ,例如在低成本处理器上(例如在Raspberry PI上),以及具有递归函数和50个第一个数字的处理器,并查看差异! , - )