Есть часть рекурсивной функции, над которой я работал, и, похоже, она возвращает неправильную ценность, чем ожидалось. Я смог воспроизвести его и упростить функцию:
function foo(i, target){
if(i < target){
i++;
foo(i, target);
}
return i;
}
console.log(foo(0,5));
В принципе, учитывая вышеприведенную функцию, я ожидаю, что возвращаемое значение будет равно 5. Однако, похоже, оно возвращается 1. Когда я сделал некоторую трассировку, я заметил, что "return i" вызывается несколько раз и каждый раз, когда он получает декрементированный с помощью 1? Какова причина такого поведения и что я могу сделать, чтобы исправить это?
Вам также нужно вернуть форму 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
Вы не возвращаете значение рекурсивного вызова
function foo(i, target){
if(i < target){
i++;
return foo(i, target);
}
return i;
}
console.log(foo(0,5));
Вы также должны 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));