一、斐波那契数列
function feibo(n) {
if (n == 0) return -1;
if (n == 1) return 0;
if (n == 2) return 1;
return feibo(n - 1) + feibo(n - 2);
}
console.log(feibo(7))
二、青蛙跳台阶问题
一个青蛙,一次只能跳一级台阶,或者跳两级台阶,这个青蛙跳上n级台阶有多少种跳法?
当青蛙跳跳一个台阶时,只有1中跳法
当青蛙跳跳2个台阶时,只有2中跳法
在3个台阶时, 有 3种跳法 [(1,1,1),(1,2), (2,1) ];
在4个台阶时,有 5种跳法 [(1,1,1,1), (1,2,1), (1,1,2), (2,1,1),(2,2)];
即规律为(0,1,1,2,3,5...)
跳上n级台阶的跳法等于跳上n-1级台阶的跳法加上跳上n-2级台阶的跳法。
jump(n) = jump(n-1) + jump(n-2)
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);
}
console.log(jump(3)) // 3
// 1 1 1
// 1 2
// 2 1
上面用递归实现的效率很低,当 N=50 的时候在chrome里就跑不动了,chrome会出现卡死。下面用迭代的方式效率会高出很多。
function jump(n) {
let target = 0, number1 = 1, number2 = 2;
if (n <= 0) return -1;
if (n == 1) return 1;
if (n == 2) return 2;
for (let i=3; i<=n; ++i) {
target = number1 + number2;
number1 = number2;
number2 = target;
}
return target;
}
当N=10000时就已经越界了,会输出 Infinity。但浏览器不会卡死,值还是会瞬间输出。
三、变态青蛙跳台阶问题
如果青蛙一次可以跳一级台阶、二级台阶、或n级台阶,跳上n级台阶有多少种跳法?
jump(n) = jump(n - 1) + jump(n - 2) + jump(n - 3) + ... + jump(2) + jump(1)
function jump(n) {
if (n <= 0) return -1;
if (n == 1) return 1;
if (n == 2) return 2;
let result = 0;
for (let i = 1; i < n; i ++) {
result += jump(n - i);
}
return result + 1; // +1是从0级台阶直接跳上去的情况
}