2016-06-12 36 views
-5

該函數將一個數字作爲輸入並返回帶有和的字符串。如何實際其工作工作原理在添加Javascript後返回一個數字並返回一個字符串

findSolution(21); 
// returns: 
((((1 + 5) + 5) + 5) + 5) 

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

+0

我是一名研究生,對功能,繼承和事件處理等方面有一點關於C++和java的知識。 :) – badarshahzad

+0

如果函數的意圖是找到一個等於給定目標的表達式,那麼它不起作用。對於許多輸入,它找不到有效的表達式。 – Alnitak

+0

我是學生:(我不太瞭解它,我只是問,你侮辱我:( – badarshahzad

回答

0

這是一個(簡單)遞歸模式。

內部功能之一:

  • 認定的目標已被發現,並返回
  • 或認定的目標已經超過,當它返回null
  • 否則試圖自稱與(n + 5)(n * 3),積累前一階段的輸出。

前兩個選項是終止遞歸的選項。

||算子是第三種情況的重要組成部分。它首先嚐試n + 5解決方案,但僅當該遞歸調用返回null時,懶惰||運營商纔會評估n * 3調用。

不過請注意,如果兩個調用失敗,因爲n * 3n + 5兩者都超出了目標值(這是他們做的,對於許多數字),那麼整個函數將返回null

+0

事情是如何返回工作? – badarshahzad

+0

糾正我,如果我錯了:在這個返回查找參數這只是加入開始+5或開始+3然後第二個參數只是傳遞字符串?如果這是好的,那麼歷史論證的作用是什麼? – badarshahzad

+0

「歷史」參數是它試圖構建的實際表達式。隨着遞歸的繼續,它逐漸變長。在find()'functoin的第一行放置一個簡單的'console.log(start,history)'作爲@nnnnnnn建議,你應該看到這個調用流程。 – Alnitak