Assessment wanted for Loops 1, 2 and 3 skill tests

Assessment wanted for Loops 1, Loops 2 and Loops 3 skill tests

Great work again, @church_craig.

Perfectly coded! :medal_sports:

Michael

I have a question about the Loops 3 skill test. It contains this function:

function isPrime(num) {
  for(let i = 2; i < num; i++) {
    if(num % i === 0) {
      return false;
    }
  }
  return true;
}

Shouldn’t this function use an if else statement instead?

What would you put into the else part?

The return true; part can’t be there, because this should only be executed when the loop finishes all rounds without finding a single number that divides num without a remainder.
The return statement doesn’t just leave the loop, it leaves the whole function.

So as the code is written the return true; statement has to be placed just before the final closing curly brace so that the result of the isPrime() function will be saved in the global scope. Because the return false; statement leaves only the for() loop but the return true; statement leaves the isPrime() function. Is this correct?

No, not quite.
Both return statements will leave the whole function. It doesn’t matter if return is inside a loop or an if statement or similar construct. return will always exit the function and gives its value to whoever called the function.
In our case it’s the if statement in the while loop that calls the function. The loop runs about 500 times and therefore isPrime() gets called the same amount. The return values of this function don’t get saved anywhere. The function will just either return true or false depending on the parameter value i and then the if statment uses this information to either write something into para.textContent or not.

So let’s say I write the code like this:

const para = document.createElement('p');

document.body.appendChild(para);

function isPrime(num) {
  for(let i = 2; i < num; i++) {
    if(num % i === 0) {
      return false;
    } else {
      return true;
    }
  }
}

for(let i = 500; i >= 2; i--) {
  if(isPrime(i)) {
    para.textContent += `${i} `;
  }
} 

If I understand you correctly, the reason that this code is incorrectly written is as follows:

First 500 will be passed into the isPrime() function. The remainder of 500 and 2 is 0, so isPrime() will immediately return false without completing the loops for numbers 3 through 499. Then 499 will be passed into isPrime() and isPrime() will immediately return true because the rest of the numbers 3 through 498 have not been evaluated. In the end all of the odd numbers will be printed.

So return true; has to be placed outside of the for() statement in isPrime() in order for the loops for numbers 2 through < num to fully run there course and thereby return only the numbers for which a number between 2 and < num return true.

Is this correct?

Yes, you got it. :+1: