Почему эта рекурсивная функция JavaScript возвращает undefined? - PullRequest
0 голосов
/ 01 мая 2018

В следующей рекурсивной функции я ожидаю, что функция вернет "arrived" в конце, но вместо этого она вернет undefined. Разве это не происходит, когда освобождение идет в блоке if, код должен возвращаться? Цените ваши комментарии к этому.

function myFun(i){
    if(i===0){return ('arrived');}
    i = i - 1;
    myFun(i);
}

Если я изменю код следующим образом, он вернет "arrived", но все еще не знает, почему вышеприведенный код не возвращает "arrived".

function myFun(i){
    if(i===0){return ('arrived');}
    i = i - 1;
    return myFun(i);
}

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Рекурсия - это функциональное наследие, поэтому написание вашей программы в функциональном стиле даст наилучшие результаты.

Это значит избегать таких вещей, как

  • императивные операторы стиля for, if, switch и т. Д., Которые не возвращают значение
  • мутация или переменные переназначения, такие как i = i + 1

const myFun = i =>
  i === 0
    ? "arrived"
    : myFun (i - 1)
    
console.log (myFun (10))
// "arrived"

Обратите внимание, что выражения, в отличие от операторов, оцениваются как значения. Мы внесли следующие изменения

  • function оператор function myFun (i) { ... } заменен на функцию выражение myFun (i) => ...
  • if оператор заменен на троичный выражение , например condition ? ifTrue : ifFalse
  • оператор присваивания переменной i = i - 1; myFun(i) заменен на выражение myFun(i - 1)

Обратите внимание, что оператор return сам по себе является побочным эффектом и мало используется в функциональной программе JavaScript.

Как и в случае с другим ответом, все пути кода должны возвращать значение ! Преимущество написания вашей программы в функциональном стиле означает, что вы не можете написать функцию, которая не возвращает значение, и вы не можете написать условие только с одной ветвью.

TL; DR: используйте функциональный стиль, и ваша проблема автоматически исчезает

0 голосов
/ 01 мая 2018

Первая функция не возвращает значение, потому что все пути кода должны возвращать значение. А после первой строки нет оператора return. Возвращает значение только при вызове с параметром 0.

...