反转整数并转文本的JavaScript程序陷入死循环,求问题原因
代码无限循环问题分析
输入123时,程序预期先反转整数得到321,再输出对应文本"one two three",但第一段代码会无限输出"one one one...",问题根源拆解如下:
第一段有问题的代码
let list = [ "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", ]; n = 123; let rev = 0; while (n > 0) { last_digit = Math.floor(n % 10); n = Math.floor(n / 10); rev = rev * 10 + last_digit; } while (rev > 0) { rem = Math.floor(rev % 10); n = Math.floor(rev / 10); console.log(list[rem]); }
问题核心
- 第一个
while循环结束后,原输入变量n被逐步除以10,最终变成0,而rev成功得到反转后的整数321。 - 进入第二个
while循环后,循环条件是rev > 0,但循环内部从未修改过rev的值——你只是把rev/10的结果赋值给了n,rev始终保持321不变。 - 这导致每次循环都会计算
321%10得到1,输出list[1]即"one",同时rev永远大于0,循环永远无法终止,进而无限输出"one"。
修复后的代码(第二段)
let list = [ "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", ]; n = 123; let rev = 0; while (n > 0) { last_digit = Math.floor(n % 10); n = Math.floor(n / 10); rev = rev * 10 + last_digit; } let r = rev; while (r > 0) { rem = Math.floor(r % 10); r = Math.floor(r / 10); console.log(list[rem]); }
修复原理
第二段代码新增变量r,将反转后的rev赋值给r,然后在第二个循环中修改的是r的值:每次循环把r除以10,r会从321变为32,再变为3,最后变为0,当循环条件r>0不成立时终止,就能正常输出"one two three"。
内容的提问来源于stack exchange,提问作者catcactcacted
相关产品推荐
相关产品推荐

