You need to enable JavaScript to run this app. 如何优化三角形分析代码的多if分支以精简代码、降低时空消耗
优惠活动
大模型
产品
解决方案
定价
更多

如何优化三角形分析代码的多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.12 03:57:03