版权声明:本文为 @iCurious
的原创文章,可以转载,但请务必注明作者和出处,谢谢合作!!!
摘要
本文主要介绍求Fibonacci数列的三种思路和算法:二分递归、线性递归和动态规划法,并直观得体现了三者得运行效率的不同
正文
二分递归版
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
/**@brief:Fibonacci数,二分递归版
/*
/* @param:n 求第n项Fibonacci数
/* @discription:虽然简洁明了,但是属于2^n的复杂度,这是无法忍受的 。
/* 并且重复递归。
/* @returns: __int64
*/
__int64 fib(int n)
{
// if(n<=0)return n;
// else if(n==1)return 1;
// else return Fibonacci_A1(n-1)+Fibonacci_A1(n-2);
return (n<2)?(__int64)n:fib(n-1)+fib(n-2);
}
线性递归版
/**@brief:Fibonacci数,线性递归版
/*
/* @param:n 求第n项Fibonacci数
/* @discription:
/*
/* @returns: __int64
*/
__int64 fib(int n,__int64 &prev)
{
if(n==0)
{
prev=1;return 0;
}
else
{
__int64 prevPrev;
prev=fib(n-1,prevPrev);
return prevPrev+prev;
}
} //用辅助变量记录前一项,返回数列的当前项
动态规划版
/**@brief:基于动态规划策略计算Fibonacci数
/*
/* @param:n 求第n项
/* @discription:仅仅使用了两个中间变量,通过n次加法和减法计算fib(n)
/* @returns: __int64
*/
__int64 fibI(int n)
{
__int64 f=0,g=1;//初始化:fib(0)=0,fib(1)=1
while(n--)
{
g=g+f;f=g-f;
//根据原始定义,通过n次加法和减法计算出fib(n)
}
return f;
}
主函数
//主函数
int main()
{
int n=0;
cin>>n;
clock_t st1,st2,st3;
clock_t en1,en2,en3;
cout<<"\n-----Fibonacii数,动态规划版-----\n";
st1=clock();
for(int i=0;i<n;i++)
cout<<"fib("<<i<<")="<<fibI(i)<<endl;
en1=clock();
cout<<"总用时t1="<<(double)(en1-st1)/CLOCKS_PER_SEC<<"s\n";
cout<<"\n-----Fibonacci数,线性递归版-----\n";
st2=clock();
__int64 f;
for(int i=0;i<n;i++)
cout<<"fib("<<i<<")="<<fib(i,f)<<endl;
en2=clock();
cout<<"总用时t2="<<(double)(en2-st2)/CLOCKS_PER_SEC<<"s\n";
cout<<"\n-----Fibonacci数,二分递归版-----\n";
st3=clock();
for(int i=0;i<n;i++)
cout<<"fib("<<i<<")="<<fib(i)<<endl;
en3=clock();
cout<<"总用时t3="<<(double)(en3-st3)/CLOCKS_PER_SEC<<"s\n";
return 0;
}
运行结果
版权声明:本文为 @iCurious
的原创文章,可以转载,但请务必注明作者和出处,谢谢合作!!!