2017-06-21 161 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) ") 

被評估。