如何优化三角形分析代码的多if分支以精简代码、降低时空消耗
三角形分析JS代码的冗余分支优化方案
原代码的核心冗余来源
原代码之所以写了大量重复的if判断,本质是没有做边值的统一排序,每次都要额外判断“当前最长边是输入的a、b还是c”,每个最长边场景下又重复写一遍角类型、等腰/等边的判定逻辑,相当于把同一套判定规则复制了3遍,不仅代码冗长,还容易出现笔误bug(比如原代码中判断最长边为b1时,平方对比逻辑写成了b1² > a1² + b1²,本身就是无效判断)。
核心优化思路
- 拿到用户输入的三个边长后,第一时间将三边从小到大排序,固定最长边为排序后的最大值,彻底砍掉所有针对“最长边到底是哪条输入值”的分支判断。
- 按照判定优先级统一走逻辑,所有类型判断只写一次,不需要重复编码。
- 合并所有输入校验、合法性校验的逻辑,去掉冗余的判断项。
分环节优化细节
1. 输入校验简化
原代码重复判断了三次输入值是否为undefined、是否小于等于0,实际转成数字后只需要统一判断:只要任意边长<=0或者是NaN,就判定为输入不合法,不需要重复写typeof检查(prompt点取消时返回的null转成Number就是0,会被统一校验逻辑捕获)。
2. 三角形合法性判定简化
原代码同时判断三个边是否大于等于另外两边之和,实际因为已经把边从小到大排好序了,只要校验最长边 < 另外两边之和就足够——另外两个边因为数值更小,只要边长为正数,天然满足“小于另外两边之和”的三角形条件,不需要重复判断。
3. 三角形类型判定去重
按照优先级固定走判定逻辑,完全不需要按最长边身份拆分支:
- 最高优先级判定等边:如果排序后的三个边全部相等,直接返回等边三角形结论。
- 其次判定角的类型:利用排序后的最长边,用勾股定理变体判断类型:
- 最长边平方 > 另外两边平方和 → 钝角
- 最长边平方 = 另外两边平方和 → 直角
- 最长边平方 < 另外两边平方和 → 锐角
- 最后判定等腰属性:排序后只需要判断相邻边是否相等(因为排序后s1 ≤ s2 ≤ s3,s1和s3相等的场景已经被等边判定提前捕获了),如果满足等腰条件,就给对应角的类型加上“等腰”后缀即可。
4. 计算逻辑简化
直接基于排序后的边值计算周长、用海伦公式算面积,去掉多余的中转赋值变量。
优化后参考代码
let edges; // 循环直到拿到合法输入 while (true) { const inputA = Number(prompt('请输入三角形第一条边长:')) const inputB = Number(prompt('请输入三角形第二条边长:')) const inputC = Number(prompt('请输入三角形第三条边长:')) // 统一校验输入有效性 if ([inputA, inputB, inputC].some(edge => edge <= 0 || Number.isNaN(edge))) { alert('输入不合法!边长必须为大于0的有效数字') continue } // 边值从小到大排序,固定最长边位置 edges = [inputA, inputB, inputC].sort((x, y) => x - y) // 仅校验最长边的三角形合法性 if (edges[2] >= edges[0] + edges[1]) { alert('不是合法三角形!最长边不能大于等于另外两边之和') continue } break } const [s1, s2, s3] = edges let triangleType // 按优先级判定三角形类型 if (s1 === s2 && s2 === s3) { triangleType = '等边三角形' } else { const isIsosceles = s1 === s2 || s2 === s3 const adjacentSquareSum = s1 ** 2 + s2 ** 2 if (s3 ** 2 > adjacentSquareSum) { triangleType = isIsosceles ? '钝角等腰三角形' : '钝角三角形' } else if (s3 ** 2 === adjacentSquareSum) { triangleType = isIsosceles ? '直角等腰三角形' : '直角三角形' } else { triangleType = isIsosceles ? '锐角等腰三角形' : '锐角三角形' } } alert(`三角形类型:${triangleType}`) // 计算周长与面积 const perimeter = s1 + s2 + s3 const halfPerimeter = perimeter / 2 const area = Math.sqrt(halfPerimeter * (halfPerimeter - s1) * (halfPerimeter - s2) * (halfPerimeter - s3)) alert(`三角形周长:${perimeter},面积:${area.toFixed(2)}`)
优化收益
- 代码体积从原代码的100多行(含冗余分支)压缩到40行左右,减少60%以上的代码量,脚本解析、加载的内存占用显著降低。
- 运行时的分支判断次数从原代码最多20次以上,降低到固定3-4次判断就可以得到结果,消除了大量重复的平方计算操作,运行时间开销大幅下降。
- 顺带修复了原代码中的逻辑笔误bug,判定逻辑更严谨。
内容的提问来源于stack exchange,提问作者Ivan Vrzogic
相关产品推荐
相关产品推荐

