递归函数是指在函数的定义中调用函数自身的函数。它通常用来解决可以分解为更小、相似子问题的问题,例如计算阶乘、斐波那契数列、树的遍历等。
1、递归函数计算1加到100示例:
-
-
function sumToN(current, target, accumulator = 0) {
-
if (current > target) {
-
return accumulator; // 当前数字超过目标数字时,返回累积和
-
} else {
-
return sumToN(current + 1, target, accumulator + current); // 递归调用
-
}
-
}
-
-
// 调用函数,计算从1加到100的和
-
const totalSum = sumToN(1, 100);
-
console.log(totalSum); // 输出结果应该是 5050
方法传参分别是:
- current 是当前处理的数字。
- target 是我们想要加到的最终数字,在这里是100。
- accumulator 是累加器,用来保存从1加到当前数字的总和。初始值设为0。
详解:当 current 超过 target 时,递归停止,函数返回累积的和。在每次递归调用中,我们将 current 加到 accumulator 上,并将 current 增加1,然后再次调用 sumToN 函数。
备注:这个递归函数可以计算任意正整数的累加和,只需将 target 参数设置为所需的数字即可。但是,由于JavaScript的调用栈大小限制,如果 target 设置得非常大,可能会导致栈溢出错误。在实际应用中,对于大范围的累加,迭代方法可能更加安全和高效。
2、一个递归函数必须有两个主要部分:
- 基本情况(Base Case): 这是递归调用结束的条件。没有基本情况或基本情况设计不当,递归将无限进行,导致栈溢出错误。
- 递归情况(Recursive Case): 这里函数调用自身来解决问题的一部分,逐步逼近基本情况。
下面是一个计算阶乘的递归函数示例:
-
function factorial(n) {
-
if (n === 0 || n === 1) { // 基本情况
-
return 1;
-
} else { // 递归情况
-
return n * factorial(n - 1);
-
}
-
}
-
-
console.log(factorial(5)); // 输出 120
上面例子中,factorial(5) 会调用 factorial(4),factorial(4) 调用 factorial(3),依此类推,直到 factorial(1) 或 factorial(0),这时返回值开始回溯并计算结果。
备注:递归函数可能导致大量的函数调用和栈空间使用,对于非常大的输入,可能会导致栈溢出。在实际应用中,需要考虑递归的深度,并在可能的情况下使用迭代或其他优化方法来避免这种问题。