从Eloquent Javascript返回null

时间:2017-02-21 15:23:41

标签: javascript recursion

所以我从Eloquent JS获得了这段代码:

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

我的问题是 null 在此递归中做了什么?当我们到达以下地点时:

find(26, history) // start = 26, history = (1+5)+5)+5)+5)+5)

它命中start > tagert语句,返回 null

接下来会发生什么?

3 个答案:

答案 0 :(得分:0)

||运算符是返回第一个或第二个调用结果的快捷方式。如果对find的第一次调用返回null,则返回第二次的结果。

在这种情况下无效意味着达到目标的方法不成功。函数findSolution基本上会尝试+ 5* 3的所有组合来达到目标​​。

答案 1 :(得分:0)

问题是带有空值的“或”(||)。

function findSolution(target) {
      function find(start, history) {
        if (start == target)
          return history;
        else if (start > target)
          return null;
        else
        {
            var result = find(start + 5, "(" + history + " + 5)"); 
            if(result != null)
                return result;
            else
                return find(start * 3, "(" + history + " * 3)"); 
        }

      }
      return find(1, "1");
    }

    console.log(findSolution(24));

其他解决方案:

function findSolution(target) {
      function find(start, history) {
        if (start == target)
          return history;
        else if (start > target)
          return false;
        else
          return find(start + 5, "(" + history + " + 5)") || 
                 find(start * 3, "(" + history + " * 3)");
      }
      return find(1, "1");
    }

结果是:

(((1 * 3) + 5) * 3)

答案 2 :(得分:0)

我试一试:

find函数只能返回2个值:字符串历史记录或null。一旦达到任何停止条件:start == targetstart > target,这将是整个递归调用的结果。

现在,对于每个递归调用,代码最多可以创建2个递归调用。如果对find(start + 5, "(" + history + " + 5)")的调用返回null(记住它只能返回null或历史记录),那么find(start * 3, "(" + history + " * 3)")将作为另一次尝试返回历史记录执行,如果第二次调用也返回null,那么null将是你的最终结果