什么是递归
递归是一种解决问题的方法,它从解决问题的各个小部分开始,直到解决最初的大问题。
递归通常涉及函数调用自身。
递归函数是像下面这样能够直接调用自身的方法或者函数:
function recursiveFunction(someParams) {
recursiveFunction(someParams);
}
递归函数必须有基线条件,即一个不再递归调用的条件(停止点),以防止无限递归。
递归的一般形式:
function understandRecursion(doIunderstandRecursion) {
const recursionAnswer = confirm('Do you understand recursion?');
if(recursionAnswer) {
return true
}
understandRecursion(recursionAnswer)
}
递归的经典应用
1.计算一个数的阶乘
- 迭代法
function factorial(num) {
if(num < 0) {
return undefined;
}
let total = 1;
for(let i = num;i > 1;i --) {
total *= i;
}
return total;
}
- 递归法
可以发现, factorial(5) = 5 * factorial(4); factorial(4) = 4 * factorail(3); factorial(3) = 3 * factorial(2) factorial(2) = 2 * factorial(1); factorial(1) = 1 factorial(0) = 0; 可以发现,求阶乘的过程其实就是递归的过程,且基线条件为 num === 0 || num === 1
function factorial(num) {
if(num === 1 || num === 0) {
return 1;
}
return num * factorial(num - 1);
}
2.斐波那契数列
-
迭代法
-
递归法
function fibonacci(n) {
if(n < 1) return 0;
if(n <= 2) return 1;
return fibonacci(n - 1) + fibonacci(n - 2);
}
- 记忆法
可以看到,在求fibonacci(5)时,fibonacci(3)被计算了两次,因此,可以把结果先存储起来
function fibonacciMemo(n) {
const memo = [0,1]
const fibonacci = (n) => {
if(memo[n] != null) {
return memo[n];
}
return memo[n] = fibonacci( n - 1) + fibonacci( n -2) ;
}
return fibonacci(n);
}