Удаление предупреждения из кода заставляет его войти в бесконечный цикл - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть фрагмент кода, в котором есть несколько оконных предупреждений. Работает нормально. Однако, если я удалю операторы оповещения, программа войдет в бесконечный цикл. Это странно для меня.

Может ли кто-нибудь помочь мне определить проблему с кодом?

function countSwaps(arr) {

    let notVisited = {}, swaps = 0;
    for (let i = 0; i < arr.length; i++) {
        notVisited[i] = true;
    }

    while (Object.keys(notVisited).length) {
        alert("main pass");
        let nextPos, currentPos = Object.keys(notVisited)[0];
        while (arr[currentPos] !== parseInt(currentPos+1)) {
            nextPos = arr[currentPos] - 1;
            [arr[currentPos], arr[nextPos]] = [arr[nextPos], arr[currentPos]];

            swaps+= 1;
            alert("Swap " + arr[currentPos] + " and " + arr[nextPos] + "\n");
            delete notVisited[nextPos];
        }
        delete notVisited[currentPos];
    }
    return swaps;
}
console.log(countSwaps([2,3,4,1,5]));

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Ну, для меня он также выполняет бесконечный цикл без предупреждений.

Кажется, что проблема в следующем выражении: parseInt(currentPos+1)

Добавление происходит до преобразования изстрока в число, например:

currentPos = '4';
currentPos + 1 == '41';
parseInt(currentPos + 1) == 41

То, что вы хотите, вероятно, parseInt(currentPos) + 1. Теперь:

currentPos = '4';
parseInt(currentPos) + 1 == 5

С этим цикл, кажется, завершается, и я получаю результат 3 перестановок из него.

0 голосов
/ 07 ноября 2019

Это причина бесконечного цикла.

while (Object.keys(notVisited).length) 

Это должно быть что-то вроде

while (Object.keys(notVisited).length > 0)

Это свойство, оно всегда будет возвращать true

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