如何用取模运算生成特定整数升降循环波形?
实现指定循环升降整数序列的方案
原代码问题分析
- 条件判断逻辑颠倒:原代码中
if (i % 4)仅在索引i不是4的倍数时调用getHeight,但需求是4的倍数位置(从1开始计数)才有非0值,其他位置为0,这直接导致逻辑完全相反。 - 无法处理下降波形:
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++; }
代码逻辑说明
- 位置判断:用
(i+1) % 4 === 0判断当前索引i对应的位置(从1开始计数)是否为4的倍数,符合需求的非0值位置条件。 - 周期计算:通过
(i+1) % cycleLength || cycleLength获取该位置在32位周期内的相对位置,避免取模为0时的异常。 - 高度计算:
4 - Math.abs(m - 4)公式可以自动处理上升和下降阶段,无需额外分支,简洁高效。
内容的提问来源于stack exchange,提问作者Lance Pollard
相关产品推荐
相关产品推荐

