第一个函数确定数字是否为素数。第二个函数应该创建一个包含所有素数的数组,包括最大值,但由于某种原因,它给了我一个无限循环。
function isPrime(num) {
for (i = 2; i < num; i++) {
if (num % i === 0) {
return false
}
}
if (num <= 1) {
return false;
}
return true;
}
function primes(max) {
var all = [];
for (i = 2; i <= max; i++) {
if (isPrime(i)) {
all.push(i);
}
}
}
primes(17);
答案 0 :(得分:3)
您的 i 变量是全局的,因此两个函数都使用相同的 i 。这意味着第一个函数会更改它,而第二个函数会循环。
由于第一个函数在完成时将 i 设置为 num-1 ,而 num 是 i的值在执行之前,它有效地减少 i 。因此 i 将在第二个函数的循环的下一次迭代中获得相同的值,永远不会前进。
通过在两个函数中添加var
关键字来解决此问题。
for(var i=2; // ...etc)
答案 1 :(得分:0)
两个循环中的变量i
是全局变量,它们会相互覆盖,因此第一个循环永远不会结束。
答案 2 :(得分:0)
在你的代码问题是变量i的范围,在素数没有计算,你可以检查到sqrt
的否,如果不能被任何不能被sqrt
整除,那么这将是一个素数不,试试这个:
function isPrime(num) {
let k = Math.sqrt(num);
for (let i = 2; i <= k; i++) {
if (num % i === 0) {
return false
}
}
return true;
}
function primes(max) {
let all = [];
for (let i = 2; i <= max; i++) {
if (isPrime(i)) {
all.push(i);
}
}
console.log(all)
}
primes(17);
primes(25);
&#13;