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

标签 javascript recursion

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)");

有点有效。为什么你可以有||无论如何,在我看来,没有对 bool 值进行处理? find()怎么样知道“回来”和这部分功能,并使用start * 3“再试一次”当它到达 start > target 的分支时因此得到 null

最佳答案

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

当调用 findSolution(target) 时,它会调用 find(1,"1")|| 起作用的原因是,如果目标是示例 24,因为(正如 elclanrs 指出的) || 是短路的,仅find(start + 5...) 调用将一直执行到 start = 26。在本次迭代中,start > target,因此它将返回 null。之前的调用(其中 start = 21)将收到 NULL,|| 将其视为 false,这会导致它 find(start * 3...),这也会导致 NULL 返回,这将返回到 start = 16 的迭代,等等。

关于javascript - 理解Javascript中的递归函数与逻辑运算符相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34816076/

相关文章:

javascript - 如何使用 WAI-ARIA 通知屏幕阅读器 div 现在可见

java - 以递归方式检查初学者(不是作业,是我学习的一部分)

javascript - 三.JS : object appears after zoom

javascript - 用 JavaScript 放慢时间

javascript - Javascript 如何解释返回 500?

javascript - 没有滚动条的水平菜单滚动

go - 使用 golang 的四叉树递归并发

Python - 当我使用递归时,如何清除字符串中的尾随空格?

javascript - 不创建新节点的递归后序树遍历

algorithm - 求总和能被 3 整除的最长序列长度