Почему моя основная рекурсия бесконечно повторяется? - PullRequest
1 голос
/ 02 июля 2019
let data = [1, 2, 3]
let sorted = []

let push = function(i) {
  while(i<data.length) {
    sorted.push(data[i])
    push(i + 1)
  }
}

push(0)

Привет, ребята,

Я пишу некоторую базовую рекурсию, и она, похоже, не завершается. Извините за основной вопрос, но я надеялся, что кто-нибудь сможет его объяснить.

Ожидаемое поведение: имитирует цикл for - перебирает массив и перемещает его в новый массив. Выход, когда мы достигаем i == data.length

Фактическое поведение: работает 0, 1, 2, затем 2, пока не переполнится стек.

Codefiddle: https://jsfiddle.net/t579jbog/

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Вы должны использовать if, а не while, и убедиться, что вы используете другое значение i в рекурсивном вызове.

let data = [1, 2, 3]
let sorted = []

let push = function(i) {
  if (i < data.length) {
    sorted.push(data[i]);
    push(i + 1);
  }
}

push(0);

console.log(sorted);
0 голосов
/ 02 июля 2019

Вы можете использовать shift () для целочисленного индекса (shift () удаляет первый элемент массива и возвращает значение, которое может быть помещено в отсортированный массив.

Затем просто проверьте, если длина массива> 0, и если это так - передайте ее той же функции, чтобы повторять функцию до тех пор, пока массив не станет пустым.

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

let data = [1, 2, 3]
let sorted = []

let push = function(arr) {
    sorted.push(arr.shift())
    console.log(sorted);
    
    if(arr.length > 0) {
      push(arr); 
    }
  }


push(data);
...