2011-07-28 22 views
1

這裏是代碼:計算時,一些錯誤:紅寶石注入問題,結果不一樣

arr = [0.054954087385762455, 0.5093998626512432, 5.880466289995431, 0.8639141517665208, 0.2152490168404071] 


     sum = arr.inject {|sum, item| sum + item} 

     tmp = 0 
     arr.each do |pwr| 
     tmp = tmp + (pwr/sum - 0.2) ** 2 
     end 
     puts tmp # 0.42948006253339877 



pp (arr.inject { |result, item| result + (item/sum - 0.2) ** 2}) # 0.4473023458029664 

結果:

0.42948006253339877 = 0.4473023458029664

爲什麼?

回答

4

你'沒有指定inject的起始值,因此它在顯式代碼中使用第一個值作爲累加器而不是0

而是執行此操作:

arr.inject(0) { ... } 
4

因爲在第二種情況下,您不對第一個元素進行任何操作,而是立即將其放入結果中。

在第一次計算中,顯式循環是從一個初始化爲零的外部sum變量開始的。

是後來的等效(注入)代碼,編碼循環需要看起來像這樣:

tmp = arr[0] 
arr[1..-1].each do |pwr| 
... 
+1

是啊。從0開始修復:'arr.inject(0){...}' –

3

你想要的是:

arr.inject(0){ |result, item| result + (item/sum - 0.2) ** 2}