墙体积雪量计算函数中使用while替代for循环的写法是否正确?
代码正确性判断
你这段用while循环实现的积雪计算逻辑本身是通顺的,核心的「左右双向填充取积雪上限」的思路符合接积雪类问题的标准解法,但存在几个需要修复的问题:
- 会修改输入的原数组:代码中直接调用
walls.reverse(),数组的reverse方法是原地修改方法,会导致外部传入的walls数组在函数执行后被反转,属于不符合预期的副作用,建议修改为walls = [...walls].reverse()先做浅拷贝再操作。 - 边界处理不全:仅判断了
walls === undefined的情况,没有处理空数组、非数组输入、数组长度小于2的场景,当传入空数组时,new Array(walls.length - 1)会创建长度为-1的数组,直接抛出范围错误。 - 你用到的
while(true)+内部break的写法完全符合JS语法规范,在这里没有逻辑错误,属于合法的循环实现方式。
关于是否应该始终优先使用for循环
完全不存在「始终优先用for循环」的说法,两种循环的适用场景不同:
- for循环更适合循环次数提前确定的场景:比如遍历固定长度的数组、执行固定次数的重复操作,它把循环变量定义、终止条件、步长逻辑都统一放在循环头部,可读性更高。
- while循环更适合循环次数不确定,需要根据运行时的计算结果判断终止时机的场景:比如你这段代码中,每次循环的步长是动态的(不是固定+1,而是直接跳到下一个更高墙体的索引位置),这种场景用while循环反而比硬套for循环更简洁,可读性更强。
如果想要代码更规范一点,也可以把终止条件写到while括号里,改成while(i < walls.length),和你现在的写法运行效果完全一致,属于编码习惯的差异,没有对错之分。
内容的提问来源于stack exchange,提问作者Eythaann
相关产品推荐
相关产品推荐

