写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
来源:力扣(LeetCode)
题解
这道题其实最传统的做法就是使用递归,但是我们知道,若递归深度过大,就会导致栈溢出
为了解决该问题,我们可以使用动态规划,将每次前两数之和存起来,便于下次直接使用,这样子,我们就把一个栈溢出的问题,变为了单纯的数学加法,大大减少了内存的压力
来源:力扣(LeetCode)
JS
var fib = function(n) {
let n1 = 0, n2 = 1, sum;
for(let i = 0; i < n; i++){
sum = (n1 + n2) % 1000000007;
n1 = n2;
n2 = sum;
}
return n1;
};
python
class Solution:
def fib(self, n: int) -> int:
a, b = 0, 1
for _ in range(n):
a, b = b, a + b
return a % 1000000007
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法
1.使用斐波那契数列解决,推出结果f(n)=f(n-1)+f(n-2)
2.矩阵快速幂 深入思考 适合数学好的朋友看
C++
typedef long long ll;
class Solution {
private:
struct Matrix{
const static int N=2;
const static ll MOD=1e9+7;
ll a[N][N];
Matrix(bool x){for(int i=0;i<N;i++)for(int j=0;j<N;j++)a[i][j]=x?i==j:0;}
Matrix operator*(Matrix&b){
Matrix C=Matrix(0);
for(int k=0;k<N;k++)
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
C.a[i][j]=(C.a[i][j]+a[i][k]*b.a[k][j])%MOD;
return C;
}
Matrix operator^(int n){
Matrix C=Matrix(1);
Matrix A=Matrix(0);
for(int i=0;i<N;i++)for(int j=0;j<N;j++)A.a[i][j]=a[i][j];
for(;n;n>>=1,A=A*A)if(n&1)C=C*A;
return C;
}
void show(){puts("");for(int i=0;i<N;i++){for(int j=0;j<N;j++)cout<<a[i][j]<<" ";puts("");}}
};
public:
int numWays(int n) {
Matrix A0=Matrix(0);
A0.a[0][0]=1,A0.a[0][1]=1;
A0.a[1][0]=0,A0.a[1][1]=0;
//A0.show();
Matrix B=Matrix(0);
B.a[0][0]=0,B.a[0][1]=1;
B.a[1][0]=1,B.a[1][1]=1;
//B.show();
Matrix C=B^n;
//C=A0*C;
//C.show();
return (A0*C).a[0][0];
}
};