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){…}