1.Q.爬楼梯(斐波那契数)一共有n个台阶,你一次可以走一个台阶,或者两个台阶。那么,走到台阶顶时,一共有多少种走法。
1阶 | 2阶 | 3阶 | 4阶 | n阶 |
---|---|---|---|---|
1种 | 2种(1、2) | 3种(111、21、12) | 5种(1111、211、112、22、121)(2+3) | f(n-1)+ f(n-2) |
直接思路:
递归法:时间复杂度:O(2n) ,空间复杂度:O(n)
迭代法:时间复杂度:O(n),空间复杂度:O(1)
#include <iostream>
using namespace std;
#define N 6
int fib1(int n)//递归法
{
if (n == 0 || n == 1)
return 1;
else
return fib1(n - 1) + fib1(n - 2);
}
int fib2(int n)//迭代法
{
int a1 = 1;
int a2 = 1;
int a3 = 1;
if (n == 0 || n == 1)
return 1;
else
{
for (int j = 0; j < n - 1; j++)
{
a3 = a1 + a2;
a1 = a2;
a2 = a3;
}
}
return a3;
}
int main()
{
cout<<fib1(N)<<endl;
cout << fib2(N)<<endl;
return 0;
}
二阶矩阵相乘可以得到,算法复杂度到O(log(n))
(这个待学习中…)