1. 斐波那契数列定义
在线测试工具: http://zh.numberempire.com/fibonaccinumbers.php
2. 算法
求解斐波那契数列的第n个数:
2.1 递归/分治法
#include <cstring>
#include <iostream>
using namespace std;
unsigned long fabinacci(unsigned int n)
{
if (n == 0)
{
return 0;
}else
if (n == 1)
{
return 1;
}else
{
return fabinacci(n - 2) + fabinacci(n - 1);
}
}
int main()
{
unsigned int n = 0;
cout<<"Please input a unsigned integer:"<<endl;
cin>>n;
cout<<"The "<<n<<"th fabonacci element is: "<<fabinacci(n);
return 0;
}
递归效率分析:
以计算f(10)为例:
从图中可以看出:要计算很多重复的之,计算重复值的数量随着N值而急剧增大。事实上该算法的时间复杂度随着n值呈指数增长
O((3/2)^n)。
2.2 迭代求解
循环求解:
#include <cstring>
#include <iostream>
using namespace std;
long long fabinacci(unsigned int n)
{
if (n == 0)
{
return 0;
}else
if (n == 1)
{
return 1;
}
long long first = 0;
long long second = 1;
for (unsigned i = 1; i < n; i++)
{
second = first + second;
first = second - first;
}
return second;
}
int main()
{
unsigned int n = 0;
cout<<"Please input a unsigned integer:"<<endl;
cin>>n;
cout<<"The "<<n<<"th fabonacci element is: "<<fabinacci(n);
return 0;
}
时间复杂度为: O(n);
2.3 通向求解
2.4 矩阵乘法 / 分治策略
推导:
#include <cstring>
#include <iostream>
using namespace std;
void MatrixMulti(long long matrix[2][2],long long matrix2[2][2])
{
long long a = matrix[0][0] * matrix2[0][0] + matrix[0][1] * matrix2[1][0];
long long b = matrix[0][0] * matrix2[0][1] + matrix[0][1] * matrix2[1][1];
long long c = matrix[1][0] * matrix2[0][0] + matrix[1][1] * matrix2[1][0];
long long d = matrix[1][0] * matrix2[0][1] + matrix[1][1] * matrix2[1][1];
matrix[0][0] = a;
matrix[0][1] = b;
matrix[1][0] = c;
matrix[1][1] = d;
}
long long fabinacci(int value)
{
if(value == 0)
{
return 0;
}
long long A[2][2] = {1,1,1,0};
long long Matrix[2][2] = {1,0,1,0};
int n = value - 1;
for(; n ;n >>= 1)
{
//odd
if(n&1)
{
MatrixMulti(Matrix,A);
}
MatrixMulti(A,A);
}
return Matrix[0][0];
}
int main()
{
unsigned int n = 0;
cout<<"Please input a unsigned integer:"<<endl;
cin>>n;
cout<<"The "<<n<<"th fabonacci element is: "<<fabinacci(n);
return 0;
}