这里是代码:计算时出现错误:
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
为什么??
答案 0 :(得分:4)
因为在第二种情况下,您不对第一个元素执行任何操作,而是立即将其放入结果中。
在第一个计算中,显式循环,首先将外部和变量初始化为零。
要与后来的( inject )代码等效,编码循环必须如下所示:
tmp = arr[0]
arr[1..-1].each do |pwr|
...
答案 1 :(得分:4)
您没有为inject
指定起始值,因此它在显式代码中使用第一个值作为累加器而不是0
。
请改为:
arr.inject(0) { ... }
答案 2 :(得分:3)
你想要的是:
arr.inject(0){ |result, item| result + (item / sum - 0.2) ** 2}