带or运算符(| |)的Javascript递归

带or运算符(| |)的Javascript递归,javascript,recursion,Javascript,Recursion,仅供参考:这是第3章中雄辩的Javascript书中的一个例子 我一直在阅读“雄辩的Javascript”这本书,我一直在想这个返回是如何工作的。它本质上要通过左边的递归循环返回序列,然后当递归循环的那一边失败时,它会从右边开始序列吗?我猜测这一点是因为我假设javascript无法拥有像Go这样的并发/并行进程 function findSequence(goal) { function find(start, history) { if (start == goal)

仅供参考:这是第3章中雄辩的Javascript书中的一个例子

我一直在阅读“雄辩的Javascript”这本书,我一直在想这个返回是如何工作的。它本质上要通过左边的递归循环返回序列,然后当递归循环的那一边失败时,它会从右边开始序列吗?我猜测这一点是因为我假设javascript无法拥有像Go这样的并发/并行进程

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那样有线程。但它确实模拟了它们。我最近读到这篇文章,这是对你问题的一个很好的回答:。来自约翰·雷斯格本人。