2014-02-27 34 views
3

我正在嘗試創建一個在JavaScript中執行Sigma符號計算的函數。 (如果你不知道西格瑪符號,下面將清楚我想要做什麼。)我的目標是創建一個函數,它可以像西格瑪符號一樣容易地編寫,並返回西格瑪符號計算的解決方案。理想情況下,我希望對函數的調用只需提供起始值,結束值和要對數字集合中的每個數字執行的計算,然後再將它們相加爲參數。如何創建一個在JavaScript中執行Sigma符號計算的函數?

例如,

thisIsMySigmaNotationFunction(1, 4, 2i+1) 

將返回:

(2(1)+1) + (2(2)+1) + (2(3)+1) + (2(4)+1) = 24 

這裏是我創建至今的代碼,它的工作原理,但我必須創建一個單獨的函數作爲2I使用+ 1個參數。我想知道是否有辦法避免這種情況並調用上面的函數,因爲2i + 1在未來可能需要更改爲i /(i + 1)或其他計算,並且不必創建每次插入作爲參數的單獨函數。

function sigmaCalculation(start, end, whatToSum){ 
    var sum = 0; 

    for (var i = start; i <= end; i++){ 
     sum += whatToSum(i); 
    }; 

    console.log(sum); 
} 

function calculationToSum(this1){ 
    return 2*this1+1; 
} 
+1

除非你讓你自己的DSL(迷你語言),很抱歉,沒辦法。 – Zirak

+0

你想通過什麼?傳遞函數(如你已經完成的)似乎是最簡單的解決方案,並且由於函數非常小,因此可以將它們作爲匿名函數傳遞。另一種方法是傳入一個字符串,然後將其解析爲操作,但這將是一個體面的工作。 –

回答

1

如果有幫助的一切,你不需要做命名功能每次調用這個時候,你可以使用匿名函數:

sigmaCalculation(1, 4, function(x) { return 2 * x + 1; }); 

這可以是相當緊湊。

現在,如果你想要做i/(i+1),你只需要改變您的來電:

sigmaCalculation(1, 4, function(x) { return x/(x + 1); }); 
0

爲了能夠使用基於字符串的輸入,而不是一個功能,你可以使用JavaScript的eval

function sigmaCalculation(start, end, whatToSum){ 
    var sum = 0; 

    for (var i = start; i <= end; i++){ 
     sum += eval(whatToSum.replace("i", i)); 
    }; 

    console.log(sum); 
} 

sigmaCalculation(0, 5, "2*i+1"); 

請注意,這不是非常安全,特別是在獲取用戶輸入時,因爲eval基本上可以運行任何和所有JavaScript代碼。

+1

不好的建議。更好地傳遞函數參數作爲'whatToSum'而不是字符串和'eval'它。 – Adam

+0

他的問題是,是否有辦法避免傳遞函數。 –

+0

夠公平的。我刪除了我的downvote,但留下了我的評論完好無損。 – Adam

0
thisIsMySigmaNotationFunction(1, 4, 2i+1) 

這句法無效。避免傳遞函數的唯一方法(例如在@ MattBurland的答案中)是動態地創建函數,例如,來自一個字符串。我已經建立了基於Osteele's functional library一個小幫手功能:

function F(body) { 
    var args = body.match(/2i+1/g).sort(); 
    return new Function(args, "return "+body.replace(/(\d+)([a-z])/g, "$1*$2")); 
} 

有了這一點,你可以寫

thisIsMySigmaNotationFunction(1, 4, F("2i+1")) 
相關問題