2016-01-15 2 views
0

В Eloquent Javascript, следующий пример приведен в качестве рекурсивной функции:Понимание рекурсивные функции в сочетании с логическими операторами в Javascript

function findSolution(target) { 
    function find(start, history) { 
    if (start == target) 
     return history; 
    else if (start > target) 
     return null; 
    else 
     return find(start + 5, "(" + history + " + 5)") || 
      find(start * 3, "(" + history + " * 3)"); 
    } 
    return find(1, "1"); 
} 

console.log(findSolution(24)); 

Хорошее объяснение дается после того, как, но у меня возникают проблемы с пониманием, почему

 return find(start + 5, "(" + history + " + 5)") || 
      find(start * 3, "(" + history + " * 3)"); 

бит произведение. Почему у вас есть || без, мне кажется, в любом случае, с булевым процессом? Как find() знает «вернуться» и к этой части функции и «попробуйте еще раз» с start * 3, когда он доберется до ветки, в которой start > target и, таким образом, получает null?

+2

'||' - [оператор короткого замыкания] (https://en.wikipedia.org/wiki/Short-circuit_evaluation). – elclanrs

+1

'find()' возвращает историю, или null. Помните, что null является [falsey] (http://stackoverflow.com/questions/19839952/all-falsey-values-in-javascript), поэтому он будет оценивать значение false и если функция не возвращает значение null, а история вернет истину (истинное значение). Вот почему он может оценивать и возвращать true или false. Как упоминалось выше, '||' является оператором короткого замыкания. Это означает, что если выражение слева от '||' оценивается как true, оно не будет оценивать выражение справа. То, как он «знает», где/как вернуться, вам нужно немного почитать о стеках вызовов в JS. –

ответ

1

У меня был наставник, помог мне преодолеть проблему.

Когда вызывается findSolution(target), он вызывает find(1,"1"). Причина || работает, потому что, если целью является пример 24, потому что (как указывал elclanrs) || - короткое замыкание, только find(start + 5...) звонки будут выполняться до start = 26. На этой итерации start > target, и таким образом она будет return null. Предыдущий вызов, в котором start = 21, получит NULL, который || рассматривает как false, что приводит к его find(start * 3...), что также приведет к возврату NULL, который вернется к итерации, в которой start = 16 и так далее.

Смежные вопросы