题目:定义Fibonacci数列如下:
/ 0 n=0
f(n)= 1 n=1
/ f(n-1)+f(n-2) n=2
输入n,用最快的方法求该数列的第n项。
/ 0 n=0
f(n)= 1 n=1
/ f(n-1)+f(n-2) n=2
输入n,用最快的方法求该数列的第n项。
分析:在很多C语言教科书中讲到递归函数的时候,都会用Fibonacci作为例子。
/************************************************************************/
/* 定义Fibonacci 数列如下:
/ 0 n=0
f(n) = 1 n=1
\ f(n-1)+f(n-2) n=2
输入n,用最快的方法求该数列的第n 项。
递归方法重复计算了很多项,通过定义两个额外空间保存前两项的值,可以空间换取时间。
复杂度为O(N)同时看到有人用数学方法进行分析处理,提出了一个O(logN)的算法,
/************************************************************************/
#include <iostream>
using
namespace
std;
int
Fibonacci1(
int
n)
//递归
{
if
(n==0||n==1)
{
return
n;
}
else
{
return
Fibonacci1(n-1)+Fibonacci1(n-2);
}
}
int
Fibonacci2(
int
n)
//额外空间
{
int
result=0;
int
a[2]={0,1};
if
(n==0||n==1)
{
return
n;
}
else
{
for
(
int
i=1;i<n;i++)
{
result=a[0]+a[1];
a[0]=a[1];
a[1]=result;
}
}
return
result;
}
int
main()
{
cout<<Fibonacci2(5)<<endl;
cout<<Fibonacci1(5);
return
0;
}