рекурсия JavaScript возвращает неправильное значение

1

Есть часть рекурсивной функции, над которой я работал, и, похоже, она возвращает неправильную ценность, чем ожидалось. Я смог воспроизвести его и упростить функцию:

function foo(i, target){    
    if(i < target){
        i++;
        foo(i, target);
    }

    return i;   
}
console.log(foo(0,5));

В принципе, учитывая вышеприведенную функцию, я ожидаю, что возвращаемое значение будет равно 5. Однако, похоже, оно возвращается 1. Когда я сделал некоторую трассировку, я заметил, что "return i" вызывается несколько раз и каждый раз, когда он получает декрементированный с помощью 1? Какова причина такого поведения и что я могу сделать, чтобы исправить это?

Теги:
recursion

3 ответа

5
Лучший ответ

Вам также нужно вернуть форму if в свой код.

function foo(i, target){    
    if(i < target){
        i++;
        return foo(i, target);
    }
   
    console.log(i);
    return i;   
}

console.log(foo(0,5));

Почему ваш код возвращает 1?

Поскольку он вызывает только foo каждый раз, когда i < target а после него вы получаете все значения, возвращаемые из вложенных вызовов, в порядке 5, 4, 3, 2, 1 а последний возвращается из первого вызова функции. Вы можете проверить это, поставив простой console.log перед return i и сравните с приведенным выше результатом.

function foo(i, target){    
    if(i < target){
        i++;
        foo(i, target);
    }
   
    console.log(i);
    return i;   
}

console.log(foo(0,5));

Чтобы визуализировать возвращаемые значения, вы можете видеть

 console.log()                               console.log()
 |   Call with 1                             -- return Call with 1
 |   |   Call with 2                            -- return Call with 2
 |   |   |   Call with 3                           -- return Call with 3
 |   |   |   |   Call with 4                          -- return Call with 4
 |   |   |   |   |   Call with 5        VS               -- return Call with 5  
 |   |   |   |   |   return 5
 |   |   |   |   return 4
 |   |   |   return 3
 |   |   return 2
 |-- return 1
  • 0
    Спасибо вам за объяснение, почему он вернулся 1. Он дал мне идею и снова запустил трассировку. Там я заметил стек вызовов с несколькими вызовами foo, и когда я перехожу через «return i», каждый вызов прерывается.
  • 0
    Смотрите также визуализацию, которую я сделал, она может помочь вам
Показать ещё 5 комментариев
2

Вы не возвращаете значение рекурсивного вызова

function foo(i, target){    
    if(i < target){
        i++;
        return foo(i, target);
    }

    return i;   
}
console.log(foo(0,5));
2

Вы также должны return вызов рекурсивной функции:

return foo(i, target);

function foo(i, target) {
  if (i < target) {
    i++;
    // Change here...
    return foo(i, target);
  }
  return i;
}
console.log(foo(0, 5));
  • 1
    ах вот и все, спасибо!
  • 1
    извинения @Soolie, но я должен отдать это Сурену Срапяну за то, что он помог мне понять, почему он возвращался 1. ура
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню