红宝石注入问题,结果不一样

时间:2011-07-28 02:14:50

标签: 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 - 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

为什么??

3 个答案:

答案 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}