2017-06-21 116 views
-1

在阅读本书时雄辩地介绍了Javascript和我碰到这个递归函数时我无法理解我的头。该函数需要一系列的参数和返回的如何,这个数字可以通过添加5或数由1下面的代码乘以达到字符串的解决方案:递归困难

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)); 
// ! (((1 * 3) + 5) * 3) 

我特别不明白的部分在else语句中,它可以使用||返回不同的函数运营商。提前致谢!

+1

它返回不同功能的*结果*。如果第一个find返回null,它将尝试第二个find并返回它。 – Will

回答

0

||运算符评估其左操作数。如果真的是真的,表达的价值就是价值;否则它评估右边的操作数,表达式的值就是该值。然后return语句返回该值。

换句话说,语句:

return <expression1> || <expression2> 

等同于:

var temp = <expression1>; 
if (temp) { 
    return temp; 
} else { 
    return <expression2>; 
} 

您可以使用一系列||运营商,例如

return <expr1> || <expr2> || <expr3> | ...; 

它将返回该系列中的第一个真值,并且不执行任何剩余的表达式。

因此,在您的功能中,它首先尝试find(start + 5, "(" + history + " + 5) ")。如果它返回一个真值,则由函数返回;如果不是,则尝试find(start * 3, "(" + history + " * 3) ")并返回该值。

+0

非常感谢! – WillemvanderVeen

0

操作数是OR运算符,它从最左侧的操作数开始操作;例如

var x = 2 || 5; 

在简单的英语,这意味着X = 2或5,但JavaScript解释器只需选择从有效左边的第一个值......在这种情况下,x是等于2

然而,如果

var x = 5 || 2 

x是等于5;但是如果我们在左侧有一个“无效”输入,当内聚时返回false,例如null和undefined; Javascript采取下一个值为“有效”或真实的例如:

var x = null || 2  

将使x = 2;

另外:

function find(){ 
    return(5/'a') 
} 
function find2(){ 
    return 12 
} 
var x = find() || find2() 

将使X等于12,因为5/'A' 是NaN(非数字),并cohesed为false。

因此,在你的递归例如:

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

如果

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

进行评估,“开始”是不是“目标”大(代码的第6行),然后空是返回和

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

被评估。