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