求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)
{
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;
while(n--)
{
g=g+f;f=g-f;
}
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;
}