Fibonacci 数列三种解法
递推解法
1.递推解题思路
根据下列递推关系通过循环算法计算第 n 项
f(0)=0,f(1)=1,f(2)=1;
f(n)=f(n-1)+f(n-2)
2.代码实现
#include<iostream>
#include<stdio.h>
#include<time.h>
using namespace std;
long long int fb(int n){
long long int a[200];
a[1]=1;
a[2]=1;
for(int i=3;i<=n;i++)
a[i]=a[i-1]+a[i-2];
return a[n];
}
int main() {
clock_t start,end,start1,end1;
int n;
cout<<"输入想获得的Fibonacci的项数(项数从1开始)"<<endl;
cin>>n;
start=clock();
for(int i=1;i<=10;i++){
long long int sum=0;
sum+=fb(n);
}
end=clock();
cout<<"用递推函数计算Fibonacci的第"<<n<<"项是 "<<fb(n)<<endl;
cout<<"需要的时间是 ";
printf("%lf %c", double(end-start)/CLOCKS_PER_SEC/10,'s');
cout<<endl;
return 0;
}
递归解法
1.递归解题思路
(1)寻找递归边界,f(1)=1,f(2)=1;
(2) 寻找递归关系,f(n)=f(n-1)+f(n-2);
2.代码实现
#include <iostream>
#include<stdio.h>
#include<time.h>
using namespace std;
long long int diguifb(int n){
if(n<=2)
return 1;
else
return diguifb(n-1)+diguifb(n-2);
}
int main() {
int n;
cout<<"输入想获得的Fibonacci的项数(项数从1开始)"<<endl;
cin>>n;
clock_t start1,end1;
start1=clock();
for(int i=1;i<=10;i++){
long long int sum=0;
sum+=diguifb(n);
}
end1=clock();
cout<<"用递归函数计算Fibonacci的第"<<n<<"项是 "<<diguifb(n)<<endl;
cout<<"需要的时间是 ";
printf("%lf %c", double(end1-start1)/CLOCKS_PER_SEC/10,'s');
return 0;
}
矩阵快速幂解法
1.解题思路
递归边界:n=1,return dd(dd 为初始矩阵)
递归关系:
当 n 为偶数时,后一项是当前项的平方
If(n%2==0) return fb((dddd),n/2)
当 n 为奇数时,后一项是前一项的平方乘以前一项
Else return fb((dddd),n/2)*dd
2.代码实现
#include<iostream>
#include<stdio.h>
struct matrix{
int tt[3][3];
};
matrix cheng(matrix x,matrix y){
matrix g;
g.tt[1][1]=(x.tt[1][1])*(y.tt[1][1])+(x.tt[1][2])*(y.tt[1][2]);
g.tt[1][2]=(x.tt[1][1])*(y.tt[2][1])+(x.tt[1][2])*(y.tt[2][2]);
g.tt[2][1]=(x.tt[2][1])*(y.tt[1][1])+(x.tt[2][2])*(y.tt[1][2]);
g.tt[2][2]=(x.tt[2][1])*(y.tt[1][2])+(x.tt[2][2])*(y.tt[2][2]);
return g;
}
matrix digui(matrix dd,long long int n){
if(n==1)
return dd;
else{
if(n%2==0)
return digui(cheng(dd,dd),n/2);
else
return cheng(digui(cheng(dd,dd),n/2),dd);
}
}
using namespace std;
int main(){
matrix m1;
m1.tt[1][1]=1;
m1.tt[1][2]=1;
m1.tt[2][1]=1;
m1.tt[2][2]=0;
int n;
cin>>n;
if(n==0)
cout<<0;
else{
matrix k=digui(m1,n);
cout<<k.tt[1][2];
}
}
三种解法计算时间对比
测试数据(n) | 输出结果 | 递推运行时间(s) | 递归运行时间(s) |
---|---|---|---|
20 | 6765 | 0.000000 | 0.001000 |
25 | 75025 | 0.000000 | 0.004000 |
30 | 832040 | 0.000000 | 0.004900 |
34 | 5702887 | 0.000000 | 0.033300 |
37 | 24157817 | 0.000000 | 0.140800 |
40 | 102334155 | 0.000000 | 0.607000 |
43 | 433494437 | 0.000000 | 2.615200 |
45 | 1134903170 | 0.000000 | 7.033400 |
60 | 1548008755920 | 0.000000 | |
70 | 190392490709135 | 0.000000 | |
80 | 23416728348467685 | 0.000000 | |
90 | 2880067194370816120 | 0.000000 | |
91 | 4660046610375530309 | 0.000000 | |
92 | 7540113804746346429 | 0.000000 | |
93 | 结果溢出 |