带or运算符(| |)的Javascript递归
仅供参考:这是第3章中雄辩的Javascript书中的一个例子 我一直在阅读“雄辩的Javascript”这本书,我一直在想这个返回是如何工作的。它本质上要通过左边的递归循环返回序列,然后当递归循环的那一边失败时,它会从右边开始序列吗?我猜测这一点是因为我假设javascript无法拥有像Go这样的并发/并行进程带or运算符(| |)的Javascript递归,javascript,recursion,Javascript,Recursion,仅供参考:这是第3章中雄辩的Javascript书中的一个例子 我一直在阅读“雄辩的Javascript”这本书,我一直在想这个返回是如何工作的。它本质上要通过左边的递归循环返回序列,然后当递归循环的那一边失败时,它会从右边开始序列吗?我猜测这一点是因为我假设javascript无法拥有像Go这样的并发/并行进程 function findSequence(goal) { function find(start, history) { if (start == goal)
function findSequence(goal) {
function find(start, history) {
if (start == goal)
return history;
else if (start > goal)
return null;
else
return find(start + 5, "(" + history + " + 5)") || find(start * 3, "(" + history + " * 3)");
}
return find(1, "1");
}
print(findSequence(24));
你说得对。如果有
expression1 | | expression2
,则javascript将首先计算expression1
,只有当它是一个假值时,才会计算expression2
返回值将是expression1
的结果,如果是truthy或不是truthy,则返回值将是expression2
的结果
因此,在您的情况下,将调用第一个find()
,只有当它返回一个错误的值时,才会计算并返回第二个find()
因此,您的return
语句:
return find(start + 5, "(" + history + " + 5)") || find(start * 3, "(" + history + " * 3)");
逻辑上等同于此:
var retVal = find(start + 5, "(" + history + " + 5)");
if (!retVal) {
retVal = find(start * 3, "(" + history + " * 3)");
}
return retVal;
这里有一些例子:
仅供参考-您的问题似乎与递归本身无关。True。Javascript不像Java那样有线程。但它确实模拟了它们。我最近读到这篇文章,这是对你问题的一个很好的回答:。来自约翰·雷斯格本人。