Используйте рекурсию для создания CountdownPassed (JS Алгоритм) - PullRequest
0 голосов
/ 03 мая 2020

Вопрос

Мы определили функцию, называемую обратным отсчетом, с одним параметром (n). Функция должна использовать рекурсию для возврата массива, содержащего целые числа от n до 1, на основе параметра n. Если функция вызывается с номером меньше 1, функция должна вернуть пустой массив. Например, вызов этой функции с n = 5 должен вернуть массив [5, 4, 3, 2, 1]. Ваша функция должна использовать рекурсию, вызывая себя, и не должна использовать циклы любого типа.

function countdown(n, newArr = []){
   
    if(n == 1){
    return newArr;
  }
    newArr.push(n);
    return countdown(n - 1)
  }


console.log(countdown(5));

Мой вопрос

Есть ли способ исправить этот код, чтобы он работал?

Я могу предоставить альтернативное решение, но я не понимаю его:

function countdown(n) {
  if (n < 1) {
    return [];
  } else {
    const arr = countdown(n - 1);
    arr.unshift(n);
    return arr;
  }
}

Ответы [ 2 ]

2 голосов
/ 03 мая 2020

Проблема в том, что вы не передаете массив рекурсивному вызову, поэтому при каждом рекурсивном выполнении создается новый пустой массив. Как следствие, он не возвращает массив, в который было добавлено значение, а новый, пустой, который возвращается после рекурсивных вызовов.

Во-вторых, вы никогда не будете pu sh значение 1 в массив. Так что было бы лучше остановить рекурсию на 0 вместо 1.

Итак, взяв эти два исправления, вы получите следующее:

function countdown(n, newArr=[]) {
    if (n <= 0) {
        return newArr;
    }
    newArr.push(n);
    return countdown(n - 1, newArr)
}

console.log(countdown(5));

Ваше альтернативное решение чисто, потому что ему не нужно передавать массив в качестве аргумента. Он использует возвращенный массив, чтобы добавить к нему следующее значение (перед ним). Это было бы моим предпочтением.

Чтобы понять, как это работает, выведите промежуточные значения:

function countdown(n) {
  if (n < 1) {
    console.log("At the end of recursion. Creating and returning an empty array.");
    return [];
  } else {
    const arr = countdown(n - 1);
    console.log("Got the following array back from the recursive call:");
    console.log(JSON.stringify(arr));
    arr.unshift(n);
    console.log("Prefixing it with " + n + " and returning the result:");
    console.log(JSON.stringify(arr));
    return arr;
  }
}

var result = countdown(5);
1 голос
/ 03 мая 2020

Вам необходимо передать массив результатов для рекурсивного вызова. И вам нужно проверить, не осталось ли значения, десять возвращают массив результатов.

function countdown(n, result = []) {
    if (n < 1) return result;
    result.push(n);
    return countdown(n - 1, result);
}

console.log(countdown(5));

В качестве другого подхода вы можете вернуть массив и для условия выхода принять конечное значение, в противном случае принять n и результат расширения рекурсивного вызова.

function countdown(n) {
    if (n < 1) return [];
    return [n, ...countdown(n - 1)];
}

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