Это будет рекурсивно вызывать функцию 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));