什么是递归?
递归是一种在函数或算法中调用自身的技术或过程。递归是通过将一个大问题分解为一个或多个与原问题相似但规模较小的子问题来解决问题的方法。递归的核心思想是将复杂的问题简化为相同类型的子问题,然后通过解决子问题来解决原始问题。
递归包含两个重要的方面:
-
递归定义:递归定义是指在解决一个问题时,将问题本身作为一部分进行定义。通过将问题分解为更小的、相同类型的子问题,递归定义将问题的解与其子问题的解联系起来。
-
递归终止条件:递归必须具有一个或多个终止条件,也称为基本情况。终止条件定义了递归的结束点,当达到终止条件时,递归将停止调用自身,并返回结果。如果没有终止条件或终止条件不满足,递归可能会无限地进行下去,导致栈溢出或无限循环。
常见题
1.阶乘
function factorial(n) {
if (n === 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
let result = factorial(5);
console.log(result); // 输出:120
正整数n的阶乘
当n=0时返回1, 否则返回 n*factorial(n - 1) 的结果
2.数组或列表求和
function arraySum(arr) {
if (arr.length === 0) {
return 0;
} else {
return arr[0] + arraySum(arr.slice(1));
}
}
let result = arraySum([1, 2, 3, 4, 5]);
console.log(result); // 输出:15
在上述代码中, 使用递归计算数组中所有元素的和,数组为空时,递归终止返回0, 否则返回数组第一个元素和剩余元素的和
arr.slice([start[, end]])
- 方法接受两个参数:起始索引和可选的结束索引。它会返回一个新的数组,包含从起始索引到结束索引(不包括结束索引)之间的元素。
start
:指定开始提取元素的索引。如果未提供此参数,则默认从索引 0 开始。end
:可选参数,指定结束提取元素的索引。slice 方法将提取的元素结束索引设为 end-1。如果未提供此参数,slice 将提取从开始索引到数组末尾的所有元素。
3. 字符串反转
function reverseString(str) {
if (str.length <= 1) {
return str;
} else {
return reverseString(str.slice(1)) + str[0];
}
}
let result = reverseString("Hello, World!");
console.log(result); // 输出:"!dlroW ,olleH"
上面的函数使用递归, 实现了字符串的反转,当字符串长度小于等于1时,终止结束,否则就调用自己