Fibonacci数列如下:
/ 0 n=0
f(n)= 1 n=1
\ f(n-1)+f(n-2) n=2
算法1:递归
#include<iostream>
using namespace std;
int Fibonacci(int n)
{
if (n == 0)
{
return 0;
}
if (n == 1)
{
return 1;
}
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
int main()
{
for (int i = 0; i < 10; i++)
{
cout << Fibonacci(i)<<" ";
}
return 0;
}
算法2:直接递推,类似于简单的DP
#include<iostream>
using namespace std;
int Fibonacci(int n)
{
int *arr = new int[n+1];
for (int i = 0; i <= n; i++)
{
if (i == 0)
{
arr[i] = 0;
}
else if (i == 1)
{
arr[i] = 1;
}
else
{
arr[i] = arr[i - 2] + arr[i - 1];
}
}
return arr[n];
}
int main()
{
for (int i = 0; i < 10; i++)
{
cout << Fibonacci(i)<<" ";
}
return 0;
}
算法3:矩阵快速幂
举个例子:计算A^7的值,A为一个矩阵。
A^7=A^111(2)=A^(100)*A(10)*A,则快速幂算法如下:
//n为幂指数,res为最终的结果,初始值为1,mult为A的指数幂,依次取值为A^(2^0),A^(2^1),A^(2^2),A^(2^3)...;
while(n! = 0)//N为幂指数
{
if (n % 2 == 1)
{
res = res*mult;
}
mult = mult*mult;
n = n >> 1;
}
对于斐波那契数列,f(n)=f(n-1)+f(n-2),写成矩阵形式,[f(n);f(n-1)]=[1,1;1,0]*[f(n-1);f(n-2)],化简可得:
[f(n);f(n-1)]=[1,1;1,0]^(n-1)*[f(1);f(0)],即数列转换为了一个矩阵幂运算,使用矩阵快速幂即可求取数列,代码如下。
#include<iostream>
using namespace std;
int ** MatrixMul(int **a, int **b,int n)
{
int **res = new int*[n];
for (int i = 0; i < n; i++)
{
res[i] = new int[n];
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
res[i][j] = 0;
for (int k = 0; k < n; k++)
{
res[i][j] += a[i][k] * b[k][j];
}
}
}
return res;
}
int** MatrixPow(int **a, int n)
{
int ** res=new int*[2];
for (int i = 0; i < 2; i++)
{
res[i] = new int[2];
}
res[0][0] = 1;
res[0][1] = 0;
res[1][0] = 0;
res[1][1] = 1;
while (n != 0)
{
if (n % 2 == 1)
{
res = MatrixMul(res,a,2);
}
a = MatrixMul(a,a,2);
n=n >> 1;
}
return res;
}
int Fibonacci(int n)
{
if (n == 0)
{
return 0;
}
if (n == 1)
{
return 1;
}
int **initMatrix=new int*[2];
for (int i = 0; i < 2; i++)
{
initMatrix[i] = new int[2];
}
initMatrix[0][0] = 1;
initMatrix[0][1] = 1;
initMatrix[1][0] = 1;
initMatrix[1][1] = 0;
int **res = new int*[2];
for (int i = 0; i < 2; i++)
{
res[i] = new int[2];
}
res = MatrixPow(initMatrix,n-1);
return res[0][0];
}
int main()
{
for (int i = 0; i < 10; i++)
{
cout << Fibonacci(i) << " ";
}
return 0;
}