动态规划
思想:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,让以后再次遇到时直接引用答案,不必重新求解。
斐波拉契数列
只考虑当前状态(因为它每一个状态逻辑都是一样的)
f(n)=f(n-1)+f(n-2)
function febol(n){
if(n<=0) return -1;
if(n == 1) return 0;
if(n == 2) return 1;
return febol(n-1)+febol(n-2);
}
青蛙跳台阶问题
- 正常型
问题:一个青蛙,一次只能跳一级台阶,或者跳两级台阶。
问:这个青蛙跳上n级台阶有多少种跳法。
思路: 如果这只青蛙,跳上了第n级台阶,那么最后一次跳跃之前,他一定在n-1级台阶或n-2级台阶上。
那么跳上n级台阶有多少种情况就变成了两个子问题:
- 跳上n-1级台阶的跳法 加上
- 跳上n-2级台阶的跳法。
// 按照此逻辑递推,跳上n-1级台阶可以拆解为两个子问题
// 既:跳上n-2级台阶的跳法 加上 跳上n-3级台阶的跳法
function jump(n){
if(n<=0) return -1;
if(n==1) return 1;
if(n==2) return 2;
return jump(n-1)+jump(n-2);
}
- 变态型
变态青蛙跳台阶:
这只青蛙,一次可以跳1级台阶、2级台阶、或n级台阶。问:这只青蛙,跳上n级台阶有多少种方法?
思路:f(n) = f(n-1) + f(n-2) + f(n-3) + …… + f(2) + f(1) + f(0)
function jump(n){
if(n <= 0) return -1;
if(n == 1) return 1;
if(n == 2) return 2;
var result=0;
for(var i=1;i<n;i++){
result+=jump(n-i);
}
return result+1;//+1是青蛙原地蹦上去的那一次;
}