class Solution {
/*
直接递归超时
*/
public int fib(int n) {
if(n==1) return 1;
if(n==0) return 0;
return fib(n-1)+fib(n-2);
}
}
class Solution {
/*
采用dp思想
*/
int f_2 = 0,f_1 = 1;
public int fib(int n) {
if(n==0) return 0;
if(n==1) return 1;
int temp = 0;
for(int i=2;i<=n;i++){
temp = f_1;
//f(n) = f(n-1)+f(n-2),这轮的f(n)不就相当于下轮中的f(n-1),也就是下一轮次的n比当前轮次的n大1
f_1+=f_2;
f_1 %=1000000007;
//这轮的f(n-1)就相当于下轮的f(n-2)
//注意这里,后面不能直接令f_2=f_1,因为这里的f_1不再是上轮中的f(n-1)所以再对f_1做变动之前要先存一下f_1的值
f_2 = temp;
}
return f_1;
}
}
class Solution {
/*
变形题:跳台阶问题
跟本题基本一样,只不过注意一点,不跳也算一种跳法
*/
public int numWays(int n) {
if(n==0||n==1) return 1;
//初始条件:对应于台阶数位1和为0的情况
//f_1:f(n-1)
//f_2:f(n-2)
int f_1 = 1;
int f_2 = 1;
int temp = 0;
for(int i=2;i<=n;i++){
temp = f_1;
f_1+=f_2;
f_1 %= 1000000007;
f_2 = temp;
}
return f_1;
}
}