使用递归实现指定最小值和最大值之间的所有整数求和
function sumRangeRecursive(min, max) {
// 基本情况:如果最小值大于最大值,则返回 0(空范围)
if (min > max) {
return 0;
}
// 递归步骤:返回当前最小值加上剩余范围的和
return min + sumRangeRecursive(min + 1, max);
}
// 示例用法:
console.log(sumRangeRecursive(1, 5)); // 输出 15 (1 + 2 + 3 + 4 + 5)
console.log(sumRangeRecursive(5, 1)); // 输出 0 (空范围)
console.log(sumRangeRecursive(-2, 2)); // 输出 0 (-2 + -1 + 0 + 1 + 2)
console.log(sumRangeRecursive(3, 3)); // 输出 3
// 非递归版本 (更高效)
function sumRangeIterative(min, max) {
let sum = 0;
for (let i = min; i <= max; i++) {
sum += i;
}
return sum;
}
console.log(sumRangeIterative(1, 5)); // 输出 15
console.log(sumRangeIterative(5, 1)); // 输出 0
console.log(sumRangeIterative(-2, 2)); // 输出 0
console.log(sumRangeIterative(3, 3)); // 输出 3
// 使用等差数列求和公式 (最高效) --- sum = (n/2) * (a1 + an)
function sumRangeFormula(min, max) {
if (min > max) return 0;
let n = max - min + 1;
return (n/2) * (min + max);
}
console.log(sumRangeFormula(1, 5)); // 输出 15
console.log(sumRangeFormula(5, 1)); // 输出 0
console.log(sumRangeFormula(-2, 2)); // 输出 0
console.log(sumRangeFormula(3, 3)); // 输出 3
解释:
-
递归版本:
sumRangeRecursive(min, max)
函数递归地计算从min
到max
的整数之和。- 基本情况: 当
min > max
时,意味着范围为空,函数返回 0。 - 递归步骤: 函数返回
min
加上sumRangeRecursive(min + 1, max)
的值,这部分递归地计算了从min + 1
到max
的整数之和。
-
非递归版本 (迭代版本): 使用简单的
for
循环,效率更高,避免了递归的函数调用开销,尤其是在处理大范围数字时。 -
等差数列求和公式: 这是计算连续整数和最有效的方法,直接使用数学公式,复杂度为 O(1)。
前端开发中的应用场景:
虽然递归方法在某些情况下更简洁易懂,但在前端开发中,对于处理大量数据或需要高性能的场景,建议使用迭代版本或等差数列求和公式,以避免潜在的堆栈溢出错误和性能问题。 例如,计算表格中某一列的总和,处理大量数据的图表等。
这个例子清晰地展示了递归方法的实现,并提供了更高效的非递归版本和数学公式方法,方便你在实际前端开发中根据具体情况选择最合适的方法。