//求解F(n),必须先计算F(n-1)和F(n-2),计算F(n-1)和F(n-2),//又必须先计算F(n-3)和F(n-4)。。。。。。以此类推,//直至必须先计算F(1)和F(0),然后逆推得到F(n-1)和F(n-2)的结果,//从而得到F(n)要计算很多重复的值,在时间上造成了很大的浪费,//算法的时间复杂度随着N的增大呈现指数增长,时间的复杂度为O(2^n),即2的n次方#include<iostream>usingnamespace std;int64_tFib(int n){if(n ==0)return0;elseif(n ==1)return1;elsereturnFib(n -1)+Fib(n -2);}intmain(int argc,charconst*argv[]){for(int i =0; i <100; i++){
cout <<"Fib("<< i <<")"<<"="<<Fib(i)<< endl;}return0;}
分治法求解
//从n(>2)开始计算,用F(n-1)和F(n-2)两个数相加求出结果,//这样就避免了大量的重复计算,它的效率比递归算法快得多,//算法的时间复杂度与n成正比,即算法的时间复杂度为O(n).#include<iostream>usingnamespace std;int64_tFib(int n){if(n ==0)return0;if(n <=2)return1;//first 是第n-2个数;second是第n-1个数int64_t first =0;int64_t second =1;while(0< n--){
second += first;
first = second - first;}return first + second;}intmain(int argc,charconst*argv[]){for(int i =0; i<50;i++){
cout <<"Fib("<< i <<")="<<Fib(i)<<endl;}return0;}