题目:写一个函数,输入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,虽然递归的代码真的很简洁,但是其效率比循环低很多,在很多时候并不推荐用递归。