了解递归函数与 Javascript 中的逻辑运算符相结合

Understanding recursive functions combined with logical operators in Javascript

本文关键字:逻辑运算符 相结合 Javascript 递归函数 了解      更新时间:2023-09-26

在 Eloquent 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

我有一位导师引导我解决这个问题。

调用findSolution(target)时,它会调用find(1,"1")||工作的原因是因为,如果目标是示例24,因为(正如elclans指出的那样)||短路,直到start = 26才会执行find(start + 5...)调用。在此迭代中,start > target ,因此它将return null 。上一个调用,其中 start = 21 ,将收到一个 NULL,||将其视为 false ,这会导致它find(start * 3...),这也将导致NULL返回,这将返回到其中的迭代,其中 start = 16 ,依此类推。