2017-02-21 43 views
1

所以我得到这个代码从雄辩JS:返回null从雄辩的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)); 

我的问题是什么做这个递归?当我们得到的地步:

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

它击中start > tagert声明其返回

接下来会发生什么?

+0

调用者获得一个'null'。如果是递归调用,它将被插入'||'(逻辑或),或者如果它是'findSolution'中的第一个,则整个结果将为'null'。 –

回答

0

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

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

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

我给它一个尝试:

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

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

+0

我想感谢这里的每一个答案,但这个对我来说非常清楚。谢谢。 – itsSajo

+0

请在我的帖子上投票:) – artemisian