题目:写一个函数,输入n, 求斐波那契数列的第n项。
分析:该题有两种实现方式递归或循环。当n比较大的时候f(n)结果也会比较大,故定义的时候可以采用long(int 也行)。递归会有大量的重复计算,而循环可以把f(n-1)和f(n-2)的值存起来,避免过多的重复计算。
上代码,先递归再循环。
#include<iostream>
#include<cstdlib>
#include <stdio.h>
#include<time.h>
long Fibonacci(unsigned int n)
{
if (n == 0)
return 0;
if (n == 1)
return 1;
return Fibonacci(n - 2) + Fibonacci(n - 1);
}
int main()
{
clock_t start, end;
int n = 40;
start = clock();
int result=Fibonacci(n);
end = clock();
double time = (end - start)/ CLOCKS_PER_SEC;
printf("%d %f", result,time);
system("pause");
}
输出结果为
-
#include<iostream> #include <stdio.h> #include<time.h> long Fibonacci(unsigned int n) { if (n == 0) return 0; if (n == 1) return 1; long FibsubOne = 1; long FibsubTwo = 0; long Fib=0 ; int i = 2; while (i <= n) { Fib = FibsubOne + FibsubTwo; FibsubTwo = FibsubOne; FibsubOne = Fib; ++i; } return Fib; } int main() { clock_t start, end; int n =40; start = clock(); int result=Fibonacci(n); end = clock(); double time = (end - start)/ CLOCKS_PER_SEC; printf("%d %f", result,time); system("pause"); }
结果显示
所以给各位初学者一个tips,虽然递归的代码真的很简洁,但是其效率比循环低很多,在很多时候并不推荐用递归。