2012-12-14 2 views
2

Je sais que c'est similaire à another SO question, mais la variable prime est censée être n'importe quel nombre autre que 1, et il me semble qu'on lui attribuerait la valeur booléenne de num != 1. Quelqu'un peut-il me dire ce que fait cette ligne de code?Que fait var premier = num! = 1; signifier?

Voici le code où il est utilisé

function isPrime(num) { 
    var prime = num != 1; // Everything but 1 can be prime 
    for (var i = 2; i < num; i++) { 
    if (num % i == 0) { 
     prime = false; 
     break; 
    } 
    } 
    return prime; 
} 

EDIT: Je suppose que cette ligne fait quelque chose comme ceci:

if(num != 1) { 
    prime = num; 
} 

Mais je veux toujours savoir pourquoi ou comment cette ligne de code fait cela.

+0

Fondamentalement 'prime' est un booléen comme vous le pensiez, et' num' est le nombre que vous vérifiez pour voir s'il est premier. – knownasilya

+0

Ah, je le vois maintenant. Je pensais que le premier était le détenteur d'un nombre, pas un booléen. –

Répondre

2

Comme vous le pensiez correctement, l'instruction var prime = num != 1; affecte le résultat de l'expression booléenne (num != 1) à la variable prime. Ce cas particulier est inclus dans le type de chaque code de vérification principal car 1 lui-même n'est pas un nombre premier.

Votre algorithme pourrait être encore plus rapide si vous avez seulement vérifié les diviseurs jusqu'à la racine carrée de la valeur d'entrée. Vous pouvez lire à ce sujet here et peut remarquer qu'il est beaucoup plus efficace de vérifier si num > i*i que sqrt(num) > i.

De plus, l'algorithme que vous avez peut encore renvoyer des valeurs incorrectes si vous lui donnez des valeurs négatives ou nulles.

+3

En fait, la boucle sera ignorée si 'num == 1'. La boucle commence avec 'i = 2' et 2 est ** PAS ** inférieure à 1. Donc ... ce n'est pas mauvais pour la performance, c'est juste mauvais pour la lisibilité. – jahroy

+0

c'est vrai. Mon mal j'étais un peu confus;) J'ai adapté ma réponse. Cependant, il est toujours mauvais de faire une boucle sur le nombre lui-même quand il serait suffisant de vérifier jusqu'à la racine carrée du nombre à vérifier. – s1lence

1

1 is not a prime number

C'est un chèque bord cas parce que for(i = 2;..) (ci-dessous) « saute » 1: parce que la boucle ne fonctionne jamais, prime est seulement fixé une fois à false (qui est l'évaluation de i != 1, lorsque i = 1) .

Cependant, je trouve qu'il est source de confusion et aurait utilisé:

if (i <= 1) { 
    return false; 
} else { 
    // other stuff 
} 
+0

Je réalise que 1 n'est pas premier. Ma question est "que fait cette ligne de code?" –

+0

@NickG. J'oublie que tout le monde ne comprend pas que 'x op y' est juste une expression en JavaScript (et les expressions évaluent les valeurs qui peuvent être assignées aux variables, etc.): -/ –

+0

Est convenu que ton code est plus lisible. C'est pourquoi vous devriez presque toujours (à mon avis) choisir d'écrire votre code de la manière la plus lisible possible. Sinon, les gens lisent votre code, se grattent la tête, créent des questions sur StackOverflow et perdent du temps à consacrer à la maintenance! – jahroy

2

En d'autres termes:

Si num == 1, réglez premier false et sauter la boucle.

Sinon, entrez la boucle et utilisez la logique standard pour déterminer la valeur de prime.

Cela se fait parce que la logique standard (dans la boucle) ne fonctionnera pas sur le nombre 1.

Par conséquent, comme pst dit, vous vérifiez le cas du bord extérieur de la boucle.

Cela aide à garder la logique propre à l'intérieur de la boucle.


Pour le rendre plus lisible (et correct pour toutes les valeurs) Je récrire comme ceci:

function isPrime(num) { 

    if (num <= 1) { 
     return false; 
    } 

    for (var i = 2; i < num; i++) { 
     if (num % i == 0) { 
      return false; 
     } 
    } 

    return true; 
} 

Vous pouvez également sortir de la boucle une fois i est supérieure à num/2 pour le rendre plus efficace.

+0

il n'y a pas de code pour sauter la boucle;) – s1lence

+0

@ s1lence - En fait, il passera la boucle car _i_ commence à 2, ce qui est ** PAS ** inférieur à 1;) – jahroy

1

Le point de cette ligne de code est d'atteindre deux objectifs en un:

  • Tout d'abord, ils ont besoin pour créer une variable booléenne
  • En second lieu, ils doivent vérifier si le nombre est 1, ce n'est pas premier

Ils font juste les deux en même temps.

Questions connexes