2021-07-12

本文对比了三种计算Fibonacci数列的方法:递推、递归和矩阵快速幂,通过实际运行时间展示了不同方法的效率差异。递推法在所有测试数据中运行时间最短,递归法随着n的增大,运行时间显著增加,而矩阵快速幂法虽然实现复杂,但在大n值下比递归更优。测试数据包括n从20到93,结果显示递归法在n=93时已导致结果溢出。
摘要由CSDN通过智能技术生成

递推解法

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((dd
dd),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)
2067650.0000000.001000
25750250.0000000.004000
308320400.0000000.004900
3457028870.0000000.033300
37241578170.0000000.140800
401023341550.0000000.607000
434334944370.0000002.615200
4511349031700.0000007.033400
6015480087559200.000000
701903924907091350.000000
80234167283484676850.000000
9028800671943708161200.000000
9146600466103755303090.000000
9275401138047463464290.000000
93结果溢出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值