JavaScript给定区间查找质数:for循环未迭代问题求助
问题分析与解决方案
嘿,我一眼就瞅出问题所在啦——全局变量i的冲突导致了你的外层循环“卡壳”!
问题根源
你代码里的两个for循环都用了未声明的i,在JavaScript里,未声明的变量会自动变成全局变量。这就意味着:
- 外层循环的
i和is_prime函数里循环的i是同一个变量 - 当第一次调用
is_prime(5)时,函数里的循环会修改这个全局i的值,导致外层循环的迭代逻辑被打乱,最终出现看起来“停在5不动”的异常情况
另外,你的质数判断循环条件i-1<=parseInt(number)**.5也有点绕,其实可以简化得更直观。
修复后的代码
function is_prime(number) { if (number === 2 || number === 3) { return true; } if (number === 0 || number === 1 || number % 2 === 0) { return false; } if ((number + 1) % 6 !== 0 && (number - 1) % 6 !== 0) { return false; } // 用let声明局部变量i,避免全局冲突 for (let i = 3; i <= Math.sqrt(number); i += 2) { if (number % i === 0) { return false; } } return true; } // 外层循环同样用let声明独立的i for (let i = 5; i <= 20; i++) { if (is_prime(i)) { console.log(i); } }
关键修改点
- 用
let声明局部i:函数内和外层循环的i现在是各自独立的局部变量,再也不会互相干扰了 - 简化循环条件:把
i-1<=parseInt(number)**.5改成i <= Math.sqrt(number),逻辑更清晰——判断质数时,只需要检查到目标数的平方根就足够了,因为如果存在大于平方根的因数,对应的另一个因数必然小于平方根
运行修复后的代码,就能得到你预期的输出:5、7、11、13、17、19啦!
内容的提问来源于stack exchange,提问作者LebeneBou
相关产品推荐
相关产品推荐

