对于循环,Javascript代码求和素数的循环非常奇怪
for loop - Javascript code summing primes is looping weirdly
我有下面的代码,我试图将所有素数相加到10。
我并没有试图为这个问题找到最有效的代码或正确的代码,但我很难理解for循环的作用。我特别是指当i = 7
。
由于我有两个嵌套的for循环,出于某种原因,i = 7
外循环不止一次,我的意思是,内循环似乎正在达到其终止条件j < k
,此时j = 2
和k = 2
似乎仍坚持继续循环。
这是代码:
var array = [2];
var total = 0;
function isPrime(i, j) {
if ( i%array[j] === 0 ) {
console.log("Not P Check: i was " + i + ", j was " + j + " and k was " + k);
console.log(i + " is not a prime");
k = j;
}
else if ((j + 1) === array.length) {
console.log(i + " is a prime");
total += i;
console.log("total so far is " + total);
array.push(i);
console.log(array);
k = j;
console.log("is P Check: i was " + i + ", j was " + j + " and k was " + k);
}
else {
j++;
console.log("Check " + (j + 1) + ": i is " + i + ", j is " + j + " and k is " + k);
isPrime(i,j);
}
}
for(var i = 3; i <=10; i++) {
var k = array.length;
for(var j = 0; j < k; j++) {
console.log("Check 1: i is " + i + ", j is " + j + " and k is " + k);
isPrime(i, j);
}
}
console.log(total);
console.log(array);
答案是内部循环在您的解决方案中是不必要的。您的递归函数已经完成了内部循环的工作。内部循环中发生的情况是,有些数字的重复次数超过了必要次数。
Dygestor的解决方案是一种方法。另一种方法是更简单的
for(var i = 3; i <= 10; i++) {
isPrime(i, 0);
}
您的方法的日志:
Check 1: i is 3, j is 0 and k is 1
3 is a prime
total so far is 3
[2, 3]
is P Check: i was 3, j was 0 and k was 0
Check 1: i is 4, j is 0 and k is 2
Not P Check: i was 4, j was 0 and k was 2
4 is not a prime
Check 1: i is 5, j is 0 and k is 2
Check 2: i is 5, j is 1 and k is 2
5 is a prime
total so far is 8
[2, 3, 5]
is P Check: i was 5, j was 1 and k was 1
Check 1: i is 6, j is 0 and k is 3
Not P Check: i was 6, j was 0 and k was 3
6 is not a prime
Check 1: i is 7, j is 0 and k is 3
Check 2: i is 7, j is 1 and k is 3
Check 3: i is 7, j is 2 and k is 3
7 is a prime
total so far is 15
[2, 3, 5, 7]
is P Check: i was 7, j was 2 and k was 2
Check 1: i is 7, j is 1 and k is 2
Check 3: i is 7, j is 2 and k is 2
Check 4: i is 7, j is 3 and k is 2
Not P Check: i was 7, j was 3 and k was 2
7 is not a prime
Check 1: i is 7, j is 2 and k is 3
Check 4: i is 7, j is 3 and k is 3
Not P Check: i was 7, j was 3 and k was 3
7 is not a prime
Check 1: i is 8, j is 0 and k is 4
Not P Check: i was 8, j was 0 and k was 4
8 is not a prime
Check 1: i is 9, j is 0 and k is 4
Check 2: i is 9, j is 1 and k is 4
Not P Check: i was 9, j was 1 and k was 4
9 is not a prime
Check 1: i is 10, j is 0 and k is 4
Not P Check: i was 10, j was 0 and k was 4
10 is not a prime
15
[2, 3, 5, 7]
删除内部循环的日志(请记住,内部循环中也缺少console.log
):
3 is a prime
total so far is 3
[2, 3]
is P Check: i was 3, j was 0 and k was 0
Not P Check: i was 4, j was 0 and k was 0
4 is not a prime
Check 2: i is 5, j is 1 and k is 0
5 is a prime
total so far is 8
[2, 3, 5]
is P Check: i was 5, j was 1 and k was 1
Not P Check: i was 6, j was 0 and k was 1
6 is not a prime
Check 2: i is 7, j is 1 and k is 0
Check 3: i is 7, j is 2 and k is 0
7 is a prime
total so far is 15
[2, 3, 5, 7]
is P Check: i was 7, j was 2 and k was 2
Not P Check: i was 8, j was 0 and k was 2
8 is not a prime
Check 2: i is 9, j is 1 and k is 0
Not P Check: i was 9, j was 1 and k was 0
9 is not a prime
Not P Check: i was 10, j was 0 and k was 1
10 is not a prime
15
[2, 3, 5, 7]
此外,k
变量在新的解决方案中是不必要的。j
将递增,直到它到达素数数组的末尾,或者直到目标数可整除,以较早者为准。
如果你想使用内部循环解决方案,你需要删除你的递归函数,并做一些类似的事情:
var primes = [2];
var sum = 0;
// Start looping
for(var i = 3; i <= 10; ++i) {
var prime = true; // Prime until proven innocent
for(var j = 0; j < primes.length; ++j) { // Length stays same until later
if(i % arr[j] === 0) { // The meat of your isPrime function: divisible?
prime = false;
break; // Stop the loop early: number is not prime!
}
}
if(prime) { // We have a prime!
primes.push(i); // Add it to our list of primes
sum += i; // Add the prime to the sum
}
}
// Log the result
console.log("The sum of primes up to 10 (inclusive)", sum);
console.log("These primes were", primes);
var array = [2];
var total = 0;
function isPrime(i, j) {
if ( i%array[j] === 0 ) {
console.log("Not P Check: i was " + i + ", j was " + j + " and k was " + k);
console.log(i + " is not a prime");
k = j;
return false;
}
else if ((j + 1) === array.length) {
console.log(i + " is a prime");
total += i;
console.log("total so far is " + total);
array.push(i);
console.log(array);
k = j;
return true;
console.log("is P Check: i was " + i + ", j was " + j + " and k was " + k);
}
else {
j++;
console.log("Check " + (j + 1) + ": i is " + i + ", j is " + j + " and k is " + k);
return isPrime(i,j);
}
}
for(var i = 3; i <=10; i++) {
var k = array.length;
for(var j = 0; j < k; j++) {
console.log("Check 1: i is " + i + ", j is " + j + " and k is " + k);
if (isPrime(i, j)) break;
}
}
console.log(total);
console.log(array);
相关文章:
- jQuery:循环一个具有不同超时值的循环
- 在循环中分配json值时,值被覆盖
- 如何在下面的ES6循环中获得前面的文本
- 为什么“;未定义的“;在JavaScript中结束循环
- Javascript循环不会自我更新
- 如何使用jquery处理php循环通过元素
- 而循环只设置php中输入字段中的第一个值
- 循环遍历数组中的特定索引
- Javascript返回值只在循环中返回一次
- 按照选项卡索引的顺序循环一个jQuery选择
- 循环遍历以数组为值的Javascript对象
- 循环中javascript的行为非常奇怪
- Webgl Angle循环非常慢
- while 循环使页面重新加载非常慢
- HTML 5 画布:在游戏中使用绘制图像会使循环非常慢
- javascript/jQuery getJSON非常慢,有一个内循环
- 非常快的JS循环
- Javascript: For循环非常慢,任何方法都可以加速它
- 对于循环,Javascript代码求和素数的循环非常奇怪
- 循环返回非常长的数组,即使它循环了3次