首页 > 解决方案 > 最后一个else块如何在乘以3和加5之间交替

问题描述

我一直在阅读 eloquent JavaScript,下面的代码是解释递归章节中一个问题的解决方案。

“考虑这个谜题:从数字 1 开始,反复加 5 或乘以 3,可以产生无限的数字集合。你将如何编写一个函数,给定一个数字,试图找到一系列这样的加法和产生那个数字的乘法?”

function findSolution(target) {
    function find(current, history) {
        if (current == target) {
        return history;
        } else if (current > target) {
          return null;
        } else {
          return find(current + 5, `(${history} + 5)`) 
            ||
          find(current * 3, `(${history} * 3)`);
          }
        }
       return find(1, "1");
      }
console.log(findSolution(24));
// → (((1 * 3) + 5) * 3)

我似乎无法理解最后一个 else 块是如何在乘以 3 和乘以 5 之间交替的,我知道 || 意味着它会从左边取它的第一个真实值。

标签: javascript

解决方案


首先,您应该注意到非空字符串是真的,而 null 是假的。现在,让我们考虑如果find(current + 5, ...)实际找到匹配项会发生什么。它将返回一个带有解决方案的字符串,该findSolution函数将返回该字符串。如果它没有找到匹配项,它将返回null,这意味着||继续到find(current * 3, ...),如果在那里找到匹配项,它将返回带有解决方案的字符串,否则将返回null。基本上,它不是交替的,它只是尝试两者并返回成功的那个。因为 24 是特殊的,所以看起来它是交替的。


推荐阅读