如何优化sumRange函数?寻求两整数区间求和的更优实现
嘿,我来帮你梳理下这段sumRange函数的优化方向,顺便聊聊怎么让它更简洁高效~
首先先说说原代码里的小问题:
- 你定义了
f和t两个变量,但从头到尾都没用到,属于冗余代码,完全可以删掉; - 用循环累加的方式虽然能实现功能,但如果遇到超大范围的数值(比如从1加到100万),循环会执行百万次,性能不如数学公式法;
- 分
to >= from和from > to两种情况判断其实没必要,完全可以用更通用的逻辑统一处理。
最优方案:用等差数列求和公式
其实从FROM到TO的整数和就是等差数列求和,公式是:总和 = (项数) × (首项 + 末项) ÷ 2
这里的项数就是两个数之间的整数个数(包括两端),用Math.abs(to - from) + 1就能算出,不管from和to谁大谁小都适用。
优化后的代码如下:
function sumRange(from, to) { const numberOfTerms = Math.abs(to - from) + 1; return numberOfTerms * (from + to) / 2; }
这个版本的优势太明显了:
- 时间复杂度是O(1),不管数值范围多大,都能瞬间算出结果;
- 代码极度简洁,没有冗余变量和分支判断;
- 所有边界情况都能覆盖(比如
from等于to时,返回的就是这个数本身,完全正确)。
如果一定要用循环实现(比如练习循环逻辑)
那也可以优化原代码的逻辑,不用分分支,先统一拿到起始和结束值,再循环累加:
function sumRange(from, to) { const start = Math.min(from, to); const end = Math.max(from, to); let result = 0; for (let i = start; i <= end; i++) { result += i; } return result; }
这个版本去掉了冗余变量,逻辑更清晰,也不用写两套循环逻辑,可读性更高。
内容的提问来源于stack exchange,提问作者crisscross
相关产品推荐
相关产品推荐

