1. 编写递归函数,一定要包含两个要件编写递归函数,一定要包含两个要件
(1)基线条件:递归的终止条件
(2)递归条件:如何对问题进行拆分
2. 递归的核心思想
- 将一个大的问题拆分为一个个小的问题,小的问题解决了,大的问题也就解决了
递归的作用和循环是一致的,不通电在于,递归的思路比较清晰简洁,循环的执行性能比较好
调函数自身过程中,会产生函数作用域,调几次就会产生几次,产生函数作用域会开辟内存空间
// 创建一个函数,可以用来求任意数的阶乘
/*
1! 1
2! 1 x 2 = 2
3! 1 x 2 x 3 = 6
......
10! 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 = xxx
*/
function jieCheng(num) {
// 创建一个变量用来记录结果
let result = 1;
for(let i = 2; i <- num; i++) {
result *= i;
}
return result;
}
let result = jieCheng(3)
console.log(result); // 6
// 用递归解决阶乘问题
/*
5! = 4! x 5
4! = 3! x 4
3! = 2! x 3
2! = 1! x 2
1! = 1
*/
function jieCheng2(num){
// 基线条件
if(num === 1){
return 1;
}
// 递归条件
// num! = (num - 1)! * num
return jieCheng2(num-1) * num;
}
result = jieCheng2(5);
console.log(result); // 120
/*
jieCheng(5)
- return jieCheng2(4) * 5
- return jieCheng2(3) * 4
- return jieCheng2(2) * 3
- return jieCheng2(1) * 2
- return 1
*/