js中递归实现
递归的基本概念
递归是一种函数调用自身的技术,通常用于解决可以分解为相似子问题的情况。在JavaScript中,递归函数需要定义基本情况(终止条件)和递归情况(调用自身)。
递归实现阶乘
阶乘是经典的递归示例,n的阶乘(n!)定义为n (n-1) ... * 1。
function factorial(n) {
if (n === 0 || n === 1) { // 基本情况
return 1;
}
return n * factorial(n - 1); // 递归情况
}
console.log(factorial(5)); // 输出: 120
递归实现斐波那契数列
斐波那契数列中每个数字是前两个数字之和(如:0, 1, 1, 2, 3, 5...)。
function fibonacci(n) {
if (n <= 1) { // 基本情况
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2); // 递归情况
}
console.log(fibonacci(6)); // 输出: 8
递归实现数组求和
递归可用于遍历数组或列表结构,逐层分解问题。
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 } }
递归的注意事项
递归可能导致堆栈溢出(如未定义终止条件或递归过深)。对于复杂问题,尾递归优化或改用循环可能更高效。






