На самом деле, с n
равным 1
довольно легко. Давайте проверим шаг за шагом. Здесь ваша sum
функция; давайте добавим строку, чтобы было легче ссылаться:
1: function sum(arr, n) {
2: if(n <= 0){
3: return 0;
4: }else {
5: return sum(arr, n - 1) + arr[n - 1];
6: }
7: }
Теперь давайте посмотрим, что происходит шаг за шагом при выполнении:
sum([2, 3, 4], 1)
Функция sum
вызывается с помощью arr
равно [2, 3, 4]
, а n
равно 1
.
Поскольку n
не меньше или равно 0 ( строка 2 ), мы go к блоку else
, в строке 5
.
Теперь вот где происходит рекурсия: мы снова вызываем функцию sum
, передавая тот же arr
, но не тот же n
, вместо этого мы передаем n - 1
.
Таким образом, мы снова вызываем sum
, на этот раз с arr
равняется [2, 3, 4]
, но с n
равняется 0
. Поскольку n
равно 0
на этот раз, при проверке строка 2 мы переходим к строка 3 и возвращаем 0
.
Теперь функция завершается со значением 0
, которое мы дали вызывающей стороне.
И вызывающей стороной sum([2, 3, 4], 0)
было выполнение sum([2, 3, 4], 1)
, в частности, в строка 5 :
5: return sum(arr, n - 1) + arr[n - 1];
Так как он вернул 0
, мы можем отображать как:
5: return 0 + arr[n - 1];
И помните, что n
равно 1
, поэтому:
5: return 0 + arr[0];
Так как arr[0]
равно 2
:
5: return 0 + 2;
И тогда почему sum([2, 3, 4], 1)
возвращает 2
.
Я не уверен, что теперь это яснее, но я надеюсь на это. :)