You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用取模运算生成特定整数升降循环波形?

实现指定循环升降整数序列的方案

原代码问题分析

  1. 条件判断逻辑颠倒:原代码中if (i % 4)仅在索引i不是4的倍数时调用getHeight,但需求是4的倍数位置(从1开始计数)才有非0值,其他位置为0,这直接导致逻辑完全相反。
  2. 无法处理下降波形:getHeight函数仅能返回上升阶段的1-4,没有考虑周期内从4降到0的逻辑,且判断的索引与需求的位置对应关系混乱。

正确实现思路

需求的序列以32个位置为一个循环周期,核心规律:

  • 仅当位置是4的倍数时(第4、8、12...32位),对应非0值,其余位置为0。
  • 周期内4的倍数位置对应的m = 位置数/4(m范围1~8),对应值为:
    • m=1→1,m=2→2,m=3→3,m=4→4
    • m=5→3,m=6→2,m=7→1,m=8→0

可以用数学公式简化计算:高度 = 4 - |m - 4|,一步得到对应值,无需多分支判断。

修正后的代码

let i = 0;
let heights: number[] = [];
const cycleLength = 32; // 循环周期长度
while (i < 1024) {
  // 判断当前位置(i+1)是否为4的倍数
  if ((i + 1) % 4 === 0) {
    // 计算该位置在周期内的相对位置(1~32)
    const posInCycle = (i + 1) % cycleLength || cycleLength;
    // 计算m值(1~8)
    const m = posInCycle / 4;
    // 用绝对值公式直接得到对应高度
    const height = 4 - Math.abs(m - 4);
    heights.push(height);
  } else {
    heights.push(0);
  }
  i++;
}

代码逻辑说明

  1. 位置判断:用(i+1) % 4 === 0判断当前索引i对应的位置(从1开始计数)是否为4的倍数,符合需求的非0值位置条件。
  2. 周期计算:通过(i+1) % cycleLength || cycleLength获取该位置在32位周期内的相对位置,避免取模为0时的异常。
  3. 高度计算:4 - Math.abs(m - 4)公式可以自动处理上升和下降阶段,无需额外分支,简洁高效。

内容的提问来源于stack exchange,提问作者Lance Pollard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:15:02