ruby注入问题,结果不一样
下面是代码:计算时,出现错误:ruby注入问题,结果不一样,ruby,Ruby,下面是代码:计算时,出现错误: 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 -
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.4294800625339877!=0.4473023458029664
为什么???因为在第二种情况下,您没有对第一个元素执行任何操作,而是立即将其放入结果中 在第一个计算(显式循环)中,您从初始化为零的外部和变量开始 为了与后面的(注入)代码等效,编码循环需要如下所示:
tmp = arr[0]
arr[1..-1].each do |pwr|
...
因为在第二种情况下,您不会对第一个元素执行任何操作,而是立即将其放入结果中 在第一个计算(显式循环)中,您从初始化为零的外部和变量开始 为了与后面的(注入)代码等效,编码循环需要如下所示:
tmp = arr[0]
arr[1..-1].each do |pwr|
...
你想要的是:
arr.inject(0){| result,item | result+(item/sum-0.2)**2}
您想要的是:
arr.inject(0){| result,item | result+(item/sum-0.2)**2}
您没有为注入指定起始值,因此它使用第一个值作为累加器,而不是显式代码中的0
改为这样做:
arr.inject(0) { ... }
您没有为inject
指定起始值,因此它使用第一个值作为累加器,而不是显式代码中的0
改为这样做:
arr.inject(0) { ... }
是的。以0开头修复它:arr.inject(0){…}
Yup。以0开头修复它:arr.inject(0){…}