递归是一种解决问题的方法,它从解决问题的各个小部分开始,直到解决最初的大问题。递归通常涉及函数调用自身。每个递归函数都必须有一个基线条件,即一个不再递归调用的条件(停止点),以防止无限递归。
1. 如何计算一个数的阶乘。
迭代阶乘:
function factorialIterative(number) {
if(number < 0) {
return undefined;
}
let total = 1;
for(let n = number; n > 1; n--) {
total = total * n;
}
return total;
}
console.log(factorialIterative(5)); // 120
递归阶乘:
function factorial(n) {
if(n === 1 || n === 0) {
return 1;
}
return n * factorial(n-1);
}
console.log(factorial(5)); // 120
2. 斐波那契数列[0、1、1、2、3、5、8、13、21、34]
迭代求法:
function fibnacci(n) {
if(n <1) return 0;
if(n <=2) return 1;
let fibNMinus2 = 0;
let fibNMinus1 = 1;
let fibN = n;
for(let i=2; i<=n; i++) {
fibN = fibNMinus1 + fibNMinus2;
fibNMinus2 = fibNMinus1;
fibNMinus1 = fibN;
}
return fibN;
}
console.log(fibnacci(4)); // 3
递归求法:
function fibnacci(n) {
if(n <1) return 0;
if(n <=2) return 1;
return fibnacci(n-1) + fibnacci(n-2);
}
console.log(fibnacci(4)); // 3
记忆化斐波那契数:
function fibnacciMemory(n) {
const memo = [0, 1]; // 缓存所有计算结果
const fibnacci = (n) => {
if(memo[n] != null) { // 结果已存在,返回
return memo[n];
};
return memo[n] = fibnacci(n-1, memo) + fibnacci(n-2, memo); // 计算该结果并存储起来
}
fibnacci(n);
return memo[n];
}
console.log(fibnacciMemory(5)); // 5