Когда я помещаю return false внутри вложенных циклов for, почему это возвращается автоматически? - PullRequest
2 голосов
/ 10 апреля 2019

Я пытаюсь написать функцию, которая возвращает true, если в руке из пяти карт есть пара. Это работает, когда я помещаю return false перед последней закрывающей фигурной скобкой. Когда я помещаю return false в вложенные циклы for, он автоматически возвращается. Почему?

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
        }
    }
}

Ответы [ 6 ]

1 голос
/ 10 апреля 2019

Чтобы продвинуться немного дальше, вы можете использовать однопетлевой подход и использовать Set для посещенных значений.

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 голосов
/ 10 апреля 2019

i = 0 при первом запуске внутреннего цикла, что означает, что вы проверяете совпадение с card.value: 4

При возврате false в текущей позиции он будет зациклен один раз, где j = [1, .., 4], и если нет других карт со значением: 4, он вернет false.

Возвращаемое значение false должно быть вне циклов, чтобы можно было проверять все значения i = [1-4].

0 голосов
/ 10 апреля 2019

Как указано в MDN:

Оператор return завершает выполнение функции и указывает значение, которое будет возвращено вызывающей функции.

MDN ссылка

Следовательно, проблема в том, что всякий раз, когда ваши критерии не удовлетворяются, вся функция останавливается, следовательно, цикл for прерывается и возвращает false при каждом сбое if.

Чтобы решить эту проблему, просто переместите оператор возврата за пределы цикла for, чтобы, если пара не найдена, false было возвращено.

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.
}

Рабочая скрипка: https://jsfiddle.net/j92acpdn/

0 голосов
/ 10 апреля 2019

Если вы разберете свой код для этого цикла for:

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

Вы можете увидеть, что return false вызывается сразу после оператора if, то есть он будет проходить только 1 итерацию цикла for,затем верните false.

Один из способов исправить это - добавить логическое значение found, которое инициализируется как false.Вместо того, чтобы возвращать true, когда совпадение найдено, измените найденное логическое значение на true.В конце функции верните значение found, независимо от true или false.

0 голосов
/ 10 апреля 2019

return оператор останавливает дальнейшее выполнение функции . В вашем коде он будет возвращать значение независимо от того, выполнено условие или нет.

Даже если вы поставите else перед return false, он все равно сделает то же самое и return в первом цикле.

0 голосов
/ 10 апреля 2019

Вот как работает JavaScript:

Оператор return останавливает выполнение функции и возвращает значение из этой функции.

Ссылка: https://www.w3schools.com/jsref/jsref_return.asp

...