js递归实现
递归的基本概念
递归是一种在函数内部调用自身的编程技术。它通常用于解决可以分解为相似子问题的问题,例如树遍历、阶乘计算等。递归函数必须包含基线条件(终止条件),否则会导致无限循环。
递归实现阶乘
阶乘是经典的递归示例。n的阶乘(n!)定义为n乘以(n-1)的阶乘,直到1。
function factorial(n) {
if (n === 1) return 1; // 基线条件
return n * factorial(n - 1); // 递归调用
}
console.log(factorial(5)); // 输出: 120
递归实现斐波那契数列
斐波那契数列中每个数字是前两个数字之和,通常以0和1开始。

function fibonacci(n) {
if (n <= 1) return n; // 基线条件
return fibonacci(n - 1) + fibonacci(n - 2); // 递归调用
}
console.log(fibonacci(10)); // 输出: 55
递归实现数组求和
递归可以用于遍历数组并计算总和。
function sumArray(arr, index = 0) {
if (index === arr.length) return 0; // 基线条件
return arr[index] + sumArray(arr, index + 1); // 递归调用
}
console.log(sumArray([1, 2, 3, 4])); // 输出: 10
递归实现深拷贝
递归可以用于创建对象的深拷贝,处理嵌套结构。

function deepCopy(obj) {
if (typeof obj !== 'object' || obj === null) return obj; // 基线条件
const copy = Array.isArray(obj) ? [] : {};
for (let key in obj) {
copy[key] = deepCopy(obj[key]); // 递归调用
}
return copy;
}
const original = { a: 1, b: { c: 2 } };
const copied = deepCopy(original);
console.log(copied); // 输出: { a: 1, b: { c: 2 } }
递归的注意事项
递归可能导致栈溢出,尤其是处理大规模数据时。尾递归优化可以缓解这个问题,但并非所有JavaScript引擎都支持。
递归代码通常简洁但可能难以调试。确保基线条件正确,避免无限递归。
对于性能敏感的场景,考虑使用迭代替代递归。






