Использование рекурсии - PullRequest
0 голосов
/ 15 апреля 2020

Я столкнулся с этой проблемой на FreeCodeCamp.org (ссылка на проблему ниже), и мне было интересно, может ли кто-нибудь помочь мне лучше понять, почему это равно 2 при вызове с суммой ([2, 3, 4], 1); Я немного посидел и посмотрел на это, но просто мысленно почувствовал, что понимаю, как это работает. Простой разработчик, пытающийся понять Рекурсию в Javascript.

Любая помощь будет высоко ценится! Спасибо inte rnet!

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

Вот ссылка на проблему: https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/basic-javascript/replace-loops-using-recursion

Ответы [ 3 ]

2 голосов
/ 15 апреля 2020

На самом деле, с 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.

Я не уверен, что теперь это яснее, но я надеюсь на это. :)

1 голос
/ 15 апреля 2020

sum(arr, n) - рекурсивная функция, которая возвращает сумму первых n элементов массива arr.

. В вашем примере вы предоставляете sum([2, 3, 4], 1), который в основном говорит: вычислить сумму первого элемента (т. е. значение n в этом примере равно 1).

Таким образом, это будет go через функцию как таковую ...

// the first time through 
function sum([2, 3, 4], 1) {
  if(1 <= 0){ // false this time
    return 0; 
  }else { // this is where we end up
    return sum([2, 3, 4], 0) + 2; // sum will be the result of the recurse back into the function, plus 2
  }
}

// the second time through 
function sum([2, 3, 4], 0) {
  if(0 <= 0){ // true this time 
    return 0; // send this result back up to the first run through
  }else {
    // not relevant this time
  }
}

// back in the the first time through, 
// we now have a value to work with below
// remember, this isn't the 'third' time through,
// it is back in the first time run through
// just re-printed here so you could see 
// where the value gets returned from the second run
function sum([2, 3, 4], 1) {
  if(1 <= 0){ // false this time
    return 0; 
  }else { // this is where we end up
    return sum(0 + 2); // we got a result from the second run through, sum is now 2
  }
}
0 голосов
/ 15 апреля 2020

sum(arr, 1-1) оценивается как 0 из-за оператора if, который проверяет, является ли n <= 0 </p>

и

arr[n-1] равно 2, поскольку вы по сути пытаетесь получить доступ к arr[1-1], который arr[0].

Следовательно, он возвращает 2, потому что return sum(arr, n-1) + arr[n-1]; оценивается в 2.

...