2
votes

Lorsque je place return false dans les boucles for imbriquées, pourquoi est-ce automatiquement renvoyé?

J'essaye d'écrire une fonction qui renvoie vrai s'il y a une paire dans une main de cinq cartes. Cela fonctionne lorsque je place return false avant la dernière parenthèse fermante. Lorsque je place le return false dans les boucles for imbriquées, il est automatiquement renvoyé. Pourquoi?

var cards = [
  {value: 4, suit: 'Clubs'},
  {value: 8, suit: 'Hearts'},
  {value: 7, suit: 'Spades'},
  {value: 5, suit: 'Clubs'},
  {value: 8, suit: 'Diamonds'},
  ]

function pair(handOfCards){
    for (var i=0; i<handOfCards.length; i++){
        for (var j=i+1; j<handOfCards.length; j++){
            if(handOfCards[i].value===handOfCards[j].value){
                return true
            }
            return false
        }
    }
}


4 commentaires

Parce que c'est ainsi que fonctionne javascript :) Partout où vous mettez un retour, la portée de la fonction se termine


vous revenez trop tôt, car vous êtes toujours en boucle.


Parce que vous retournez faux quoi qu'il arrive. Un simple débogage ou "jouer à l'ordinateur" vous dira pourquoi - lorsque vous appuyez sur l'instruction return en dehors d'une condition que vous ... retournez. developer.mozilla.org/en-US/docs/ Web / JavaScript / Reference /… "L'instruction return termine l'exécution de la fonction et spécifie une valeur à renvoyer à l'appelant de la fonction."


Déplacez simplement le return false hors des boucles for, car il ne doit renvoyer false que si true ne doit pas être renvoyé. return , en javascript, arrête toute exécution ultérieure de son bloc fonction .


5 Réponses :


-1
votes
L'instruction

<₹ return arrête la poursuite de l'exécution de la fonction . Dans votre code, il renverra une valeur, que la condition soit satisfaite ou non.

Même si vous mettez else avant return false , il fera de même et return dans la première boucle.


0 commentaires

-1
votes

Si vous décomposez votre code en cette boucle for:

for (var j=i+1; j<handOfCards.length; j++){
            if(handOfCards[i].value===handOfCards[j].value){
                return true
            }
            return false
}

Vous pouvez voir que return false est appelé juste après l'instruction if, ce qui signifie que cela ne passera que par 1 itération du for boucle, puis retournez false.

Une manière de résoudre ce problème serait d'ajouter une valeur booléenne found initialisée à false. Au lieu de renvoyer true lorsque la correspondance est trouvée, remplacez le booléen trouvé par true. À la fin de la fonction, retournez la valeur found , indépendamment de true ou false.


0 commentaires

0
votes

Comme indiqué dans le MDN:

L'instruction return termine l'exécution de la fonction et spécifie une valeur à renvoyer à l'appelant de la fonction.

Lien MDN a >

Par conséquent, le problème est que chaque fois que vos critères ne sont pas satisfaits, la fonction entière est arrêtée, donc la boucle for est interrompue et renvoie false chaque fois que if échoue.

Pour résoudre le problème, déplacez simplement l'instruction return en dehors des boucles for, de sorte que si aucune paire n'est trouvée, false est renvoyé.

function pair(handOfCards){
    for (var i=0; i<handOfCards.length; i++){
        for (var j=i+1; j<handOfCards.length; j++){
            if(handOfCards[i].value===handOfCards[j].value){
                return true;
            }
        }
    }
    return false; // <-- return false statement moved here.
}


0 commentaires

1
votes

Pour vous déplacer un peu plus loin, vous pouvez utiliser une approche en boucle unique et utiliser un Définir pour les valeurs visitées.

function pair(handOfCards) {
    var i,
        values = new Set;

    for (i = 0; i < handOfCards.length; i++) {
        if (values.has(handOfCards[i].value)) { // check set
            return true;
        }
        values.add(handOfCards[i].value);       // add value to set
    }
    return false;
}

var cards1 = [{ value: 4, suit: 'Clubs' }, { value: 8, suit: 'Hearts' }, { value: 7, suit: 'Spades' }, { value: 5, suit: 'Clubs' }, { value: 8, suit: 'Diamonds' }],
    cards2 = [{ value: 4, suit: 'Clubs' }, { value: 8, suit: 'Diamonds' }];

console.log(pair(cards1)); //  true
console.log(pair(cards2)); // false


0 commentaires

0
votes

i = 0 le premier passage dans la boucle interne signifiant que vous recherchez une correspondance avec card.value: 4

Avec le retour false à la position actuelle, il bouclera une fois où j = [1, .., 4] et s'il n'y a pas d'autres cartes avec la valeur: 4, il retournera false.

Le retour false doit être en dehors des boucles pour permettre la vérification de toutes les valeurs i = [1-4].


0 commentaires