Javascript代码求和素数的循环异常
我有下面的代码,我试图将所有的素数相加到10 我不想为这个问题找到最有效的代码或正确的代码,但我很难理解for循环是如何工作的。我的具体意思是当Javascript代码求和素数的循环异常,javascript,for-loop,primes,Javascript,For Loop,Primes,我有下面的代码,我试图将所有的素数相加到10 我不想为这个问题找到最有效的代码或正确的代码,但我很难理解for循环是如何工作的。我的具体意思是当I=7时 由于我有两个嵌套的for循环,出于某种原因,I=7外循环不止一次循环,我的意思是,内循环似乎达到了它的终止条件j
I=7
时
由于我有两个嵌套的for循环,出于某种原因,I=7
外循环不止一次循环,我的意思是,内循环似乎达到了它的终止条件j
,此时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);
var数组=[2];
var合计=0;
函数isPrime(i,j){
if(i%数组[j]==0){
log(“非P检查:i为“+i+”,j为“+j+”,k为“+k”);
log(i+“不是素数”);
k=j;
}
else if((j+1)==数组长度){
log(i+“是素数”);
总数+=i;
console.log(“到目前为止的总数为”+总数);
阵列推送(i);
console.log(数组);
k=j;
log(“是P检查:我是“+i+”,j是“+j+”,k是“+k”);
}
否则{
j++;
log(“检查”+(j+1)+”:i是“+i+”,j是“+j+”,k是“+k”);
isPrime(i,j);
}
}
对于(var i=3;i我为您创建了一个小提琴并编辑了几行。基本上,我更改了isPrime以返回一个布尔值,并告诉循环在找到素数后中断。在您的版本中,当它达到7时,7被推入数组(array.length增加)现在,当我们已经发现,7是一个素数,我们想打破我们的内部循环,继续使用不同的i
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);
var数组=[2];
var合计=0;
函数isPrime(i,j){
if(i%数组[j]==0){
log(“非P检查:i为“+i+”,j为“+j+”,k为“+k”);
log(i+“不是素数”);
k=j;
返回false;
}
else if((j+1)==数组长度){
log(i+“是素数”);
总数+=i;
console.log(“到目前为止的总数为”+总数);
阵列推送(i);
console.log(数组);
k=j;
返回true;
log(“是P检查:我是“+i+”,j是“+j+”,k是“+k”);
}
否则{
j++;
log(“检查”+(j+1)+”:i是“+i+”,j是“+j+”,k是“+k”);
返回i,j;
}
}
对于(var i=3;i来说,答案是在您的解决方案中不需要内环。您的递归函数已经在做内环的工作。内环中发生的情况是,一些数字的重复次数超过了需要的次数
Dygestor的解决方案是一种方法,另一种方法更简单
for(var i = 3; i <= 10; i++) {
isPrime(i, 0);
}
删除内部循环的日志(请记住,内部循环中也缺少控制台.log
):
另外,在新的解决方案中,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 primes=[2];
var总和=0;
//开始循环
对于(var i=3;i)您是如何确定它不止一次循环的?看起来您的内部循环是不必要的,您的iPrime函数已经在运行了吗?@jack i刚刚在循环中添加了一个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]
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);