Как эту функцию выполнить в деталях? - PullRequest
2 голосов
/ 10 января 2020

Я не понимаю, как эта функция выполняется. Может кто-нибудь объяснить это мне, пожалуйста? Я понимаю первый шаг: если n<=0, то функция прекращает выполнение.

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

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

Почему результат 5? Я хочу, чтобы кто-то объяснил, как выполняется функция.

Ответы [ 3 ]

0 голосов
/ 10 января 2020

вот хорошее чтение по рекурсии 3. после рекурсивного вызова следующее значение n будет равно 0, и оно возвратит arr [0], то есть 2, и во время всплытия добавит значения, и результат будет 5.

0 голосов
/ 10 января 2020

Это рекурсивная функция, чтобы понять результат, который вы должны отследить до кода и проверить результат STACK CALL;

ПРИМЕЧАНИЕ : поскольку в вашем коде есть оператор return, нет необходимости использовать if if в вашем коде; сначала, если этого достаточно, вы выполняете функцию при первом вызове, снова вызовите сумму и получите значение arr[1] = 3, то в следующем стеке вызовов функция суммы имеет sum([2,3,4], 0), поскольку n = 0, тогда она будет return arr[0], что равно 2; окончательный результат будет 2 + 3 = 5 STACK CALL

0 голосов
/ 10 января 2020

Это будет рекурсивно вызывать функцию sum и суммировать все числа от arr[n] до arr[0].

Мы можем просто заменить и развернуть (эффективные) вызовы функций, чтобы проверить, что происходит:

sum([2, 3, 4], 1)

Выполнение будет go до else ветви функции, потому что n <= 0 равно false, поэтому, если мы заменим этот код, мы получим:

sum(arr, n - 1) + arr[n]

Поскольку у нас есть значения arr (это [2, 3, 4]) и n (то есть 1), мы также можем заменить их:

sum([2, 3, 4], 1 - 1) + [2, 3, 4][1]

Теперь давайте разверните вызов функции еще раз. Эффективный вызов - sum([2, 3, 4], 0), поэтому на этот раз код будет go в ветви if, поскольку n <= 0 равен true, и мы получим:

[2, 3, 4][0] + [2, 3, 4][1]

Я также заменил arr из arr[0] с аргументом, который у нас есть для этого.

Больше нет рекурсивных вызовов sum, поэтому мы закончили с развертыванием.

Теперь мы просто вычислить - что такое ноль элемента [2, 3, 4] и что элемент один из [2, 3, 4]:

2 + 3

Наконец, простое сложение дает нам 5.

Если это легче читать, вот рекурсия, превращенная в прямую l oop при сохранении близости рекурсивного потока управления:

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

console.log(sum([2, 3, 4], 1));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...