(1)
#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;
}
(2)分治策略
#include <iostream>
#include<string>
using namespace std;
struct Matrix
{ int matrix[2][2];
int m,n;
Matrix(int data[2][2])
{
for(m=0;m<2;m++)
{
for(n=0;n<2;n++)
matrix[m][n]=data[m][n];
}
}
};
Matrix Multiply(Matrix M,Matrix N)
{
Matrix t=M;
t.matrix[0][0]=M.matrix[0][0]*N.matrix[0][0]+M.matrix[0][1]*N.matrix[1][0];
t.matrix[0][1]=M.matrix[0][0]*N.matrix[0][1]+M.matrix[0][1]*N.matrix[1][1];
t.matrix[1][0]=M.matrix[1][0]*N.matrix[0][0]+M.matrix[1][1]*N.matrix[1][0];
t.matrix[1][1]=M.matrix[1][0]*N.matrix[0][1]+M.matrix[1][1]*N.matrix[1][1];
return t;
}
Matrix MatrPow(Matrix &m,int n) //求解m的n次方
{
int data[2][2]={1,0,0,1};
Matrix result(data); //赋初值为单位矩阵
Matrix tmp=m;
for(;n;n>>=1)
{
if(n &1)
result=Multiply(result,tmp);
tmp=Multiply(tmp,tmp);
}
return result;
}
int Fib(int n)
{
int data[2][2]={1,1,1,0};
Matrix A(data); //赋初值为
Matrix an=MatrPow(A,n-1);
int F0=0;
int F1=1;
return F1*an.matrix[0][0]+F0*an.matrix[1][0];
}
void main()
{
for(int i=1;i<10;i++)
cout<<Fib(i)<<endl;
}