JavaScript Рекурсивная функция> Откуда берется это выходное значение? - PullRequest
1 голос
/ 13 марта 2020

Следующая простая функция принимает массив и число и по существу выводит длину этого массива * указанное число.

function sum(arr, n) {
  if (n <= 0) {
    return 0;
  } else {
    return sum(arr, n - 1) + arr[n - 1];
  }
}

Если мы вызываем следующее: sum([2, 3, 4, 5], 3), мы правильно получаем 9 как конечное выходное значение.
Например:

function sum(arr, n) {
  if (n <= 0) {
    return 0;
  } else {
    return sum(arr, n - 1) + arr[n - 1];
  }
}

console.log(sum([2, 3, 4, 5], 3))

Не уверен, что я понимаю, что здесь происходит, хотя. Где хранится это окончательное значение? Я вижу, что вызов функции в функции и использование уменьшающихся значений в каждом случае по существу заменяет a для l oop, но без дополнительного контекста я бы ожидал, что выходные данные всегда будут возвращать 0 или функция не будет работать в все.

Какие скрытые аспекты вступают в игру, чтобы вернуть этому желаемое значение?

Ответы [ 3 ]

1 голос
/ 13 марта 2020

Нет скрытых аспектов. Это классический пример рекурсии. Он имеет базовый регистр :

if (n <= 0) {
    return 0;
}

..., который срабатывает, когда в массиве нет элементов: в этом случае сумма действительно равна нулю.

И он имеет рекурсивный регистр , когда массив имеет один или несколько элементов:

else {
    return sum(arr, n - 1) + arr[n - 1];
}

Здесь мы решаем проблему для более короткого массива (отсюда n - 1), и предполагая, что его результат правильный, нам просто нужно добавить значение к нему, которое было опущено: arr[n - 1]. Это не обязательно ноль. Когда массив имеет размер 1, мы получаем 0 + arr[0] здесь.

1 голос
/ 13 марта 2020

Вы можете добавить регистратор и наблюдать за работой алгоритма.

function sum(arr, n) {
  if (n <= 0) {
    return 0;
  } else {
    console.log(n, arr[n - 1]);
    return sum(arr, n - 1) + arr[n - 1];
  }
}

console.log(sum([2, 3, 4, 5], 3))
0 голосов
/ 13 марта 2020

в первом l oop при вызове sum([2, 3, 4, 5], 3), тогда ваша функция возвращает следующее sum([2,3,4,5], 2) + 4

во втором l oop при вызове sum([2, 3, 4, 5], 2) (который был возвращен в первый l oop), затем ваша функция возвращает следующее sum([2, 3, 4, 5], 1) + 3

в третьем l oop, когда вы вызываете sum([2, 3, 4, 5], 1) (который был возвращен во втором l oop), затем ваш функция возвращает следующее sum([2, 3, 4, 5], 0) + 2

в четвертом l oop при вызове sum([2, 3, 4, 5], 0) (который был возвращен в третьем l oop), тогда ваша функция возвращает следующее 0

так эффективно, как будто вы возвращаетесь 0 + 2 + 3 + 4

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