题目
写一个函数,输入n, 求斐波那契数列的第n项。
递归
问题规模为:
T(n)=T(n−1)+T(n−2)
如果我们估计一下,让
T(n−1)=T(n−2)
那么
T(n)=2T(n−1)
那么
O(n)=2n
简介而不高效
long long Fibonacci(int n) {
if (n <= 0) return 0;
if (n == 1) return 1;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
递推
一次遍历,复杂度为
O(n)
个人觉得是最优,省空间,省时间
long long Fibonacci(int n) {
if (n <= 0) return 0;
if (n == 1) return 1;
long long n2 = 0;
long long n1 = 1;
long long n0;
for (int i = 2; i <= n; i ++) {
n0 = n2 + n1;
n2 = n1;
n1 = n0;
}
return n0;
}
矩阵乘法
原理就是:
[f(n)f(n−1)f(n−1)f(n−2)]=[1110]n−1
如果加上快速幂的话,复杂度可以变为 O(logn)
我自己实现之前用类实现了一个矩阵,重载了^, *等运算符,具体在:
https://github.com/preke/AimToOffer/blob/master/class_matrix.c%2B%2B
所以下面的实现只写函数:
Matrix FastPower(const Matrix & m, int n) {
if (n == 1) {
return m;
}
if (n % 2 == 0) {
return FastPower(m, n/2) * FastPower(m, n/2);
} else {
return FastPower(m, (n - 1)/2) * FastPower(m, (n - 1)/2) * m;
}
}
Matrix m = Matrix(2, 2); //在此我们输入 1,1,1,0 初始化这个矩阵
int Fibonacci(int n) {
if (n <= 0) return 0;
if (n == 1) return 1;
Matrix m1 = m;
m1 = FastPower(m1, n-1);
return m1.get(0, 0); //为f(n)
}
int main() {
for(int i = 0; i < 10; i ++)
cout << Fibonacci(i) << endl;
}
(数据类型这里用int,如果要用大数的话,可以自己换数据类型)