来自eloquent javascript的javascript闭包教程

时间:2011-09-24 16:00:45

标签: javascript recursion closures

这个问题非常类似于这个帖子Javascript..totally lost in this tutorial

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

我被困在这个部分:

    find(start * 3, "(" + history + " * 3)"); 

每次开始超越目标它会做什么?它说它返回null但是当我测试并在

上放置断点时
    if (start == goal) it shoes this on the console

    history: "(((((1 + 5) + 5) + 5) + 5) + 5)"
    start: 26

    history: "(((((1 + 5) + 5) + 5) + 5) * 3)"
    start: 63

它加起来* 3并取消+5,我不明白怎么做。

2 个答案:

答案 0 :(得分:2)

退货声明:

      return find(start + 5, "(" + history + " + 5)") ||
             find(start * 3, "(" + history + " * 3)");

是涉及“||”的表达式运营商。该运算符将导致左侧被评估。如果结果不为null,为零,false或空字符串,则返回该值。如果它是那些“假”值之一,则评估并返回第二个表达式。

换句话说,可以像这样重写:

       var plusFive = find(start + 5, "(" + history + " + 5)");
       if (plusFive !== null)
         return plusFive;
       return find(start * 3, "(" + history + " * 3)")

如果“start”超过“goal”,则该函数返回null。当然,如果两个替代方案都不起作用,那么整个事情将返回null。

答案 1 :(得分:0)

表达式:

find(start + 5, "(" + history + " + 5)") || 
    find(start * 3, "(" + history + " * 3)")

首先会尝试评估:

find(start + 5, "(" + history + " + 5)")

如果返回的值不为null,0,false或空字符串,则语句将计算为返回值。 如果返回的值为null,0,false或空字符串,则接下来将评估以下内容:

find(start * 3, "(" + history + " * 3)")

如果返回的值不为null,0,false或空字符串,则语句将计算为返回值。 如果返回的值为null,0,false或空字符串,则语句的计算结果为null,0,false或空字符串(以* 3函数调用返回的为准)。

所以这一行:

return find(start + 5, "(" + history + " + 5)") || 
    find(start * 3, "(" + history + " * 3)")

就像是说“我打算通过猜测我在这一步添加5来试图找到解决方案,如果这不起作用,我会尝试在这一步乘以3,如果不是不行,我放弃了!“