可以通过编写递归函数来解决各种问题,例如计算阶乘、斐波那契数列、深度遍历数据结构等。下面是几个常见递归函数的示例:
1. 计算阶乘
阶乘(Factorial)是一个正整数的乘积,通常表示为 n!
,即 n * (n-1) * (n-2) * ... * 1
。以下是计算阶乘的递归函数:
function factorial(n) {
if (n === 0) {
return 1;
}
return n * factorial(n - 1);
}
// 测试
console.log(factorial(5)); // Output: 120
2. 斐波那契数列
斐波那契数列(Fibonacci Sequence)是从 0
和 1
开始的数列,其中每个数是前两个数之和。以下是计算斐波那契数列第 n
项的递归函数:
function fibonacci(n) {
if (n <= 1) {
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
// 测试
console.log(fibonacci(6)); // Output: 8
3. 深度遍历对象
递归可以用于深度遍历和处理嵌套的对象或数组。例如,我们可以编写一个递归函数来打印对象中的所有属性:
function deepPrint(obj, indent = 0) {
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(' '.repeat(indent) + key + ': ' + obj[key]);
if (typeof obj[key] === 'object' && obj[key] !== null) {
deepPrint(obj[key], indent + 2);
}
}
}
}
// 测试
const nestedObject = {
a: 1,
b: {
c: 2,
d: {
e: 3,
f: 4
}
}
};
deepPrint(nestedObject);
输出结果:
a: 1
b: [object Object]
c: 2
d: [object Object]
e: 3
f: 4
4. 深拷贝对象
前面已经提到的深拷贝函数也是一个典型的递归函数
function deepCopy(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj; // 基本类型和 null 直接返回
}
let copy = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
copy[key] = deepCopy(obj[key]);
}
}
return copy;
}
// 测试
const obj = {
a: 1,
b: { c: 2, d: { e: 3 } },
f: [4, 5, { g: 6 }]
};
const copiedObj = deepCopy(obj);
console.log(copiedObj);