为什么reduce实现为nil返回undefined方法:一旦布尔检查返回true,就返回NilClass

时间:2014-04-21 13:18:43

标签: ruby

我需要找到所有数字的总和,它们等于数字的阶乘之和。我有一个算法:

def equal_to_sum_of_factorial_digits?(n)
  n == n.to_s.scan(/\d/).map{|s| s.to_i}.reduce{|acc,j| (j == 0 || j == 1) ? 1 : acc + (1..j).inject(:*)}
end

start = Time.now
answer = (10..145).reduce {|acc,j| acc + j if equal_to_sum_of_factorial_digits?(j)}

puts "The answer is #{answer} and it took #{(Time.now-start)*1000} milliseconds."

此处equal_to_sum_of_factorial_digits?将数字分成不同的数字,然后在11(1或0阶乘为1)或阶乘的情况下添加值0如果2最高为9,则为值。然后,答案对具有该属性的范围内的所有值进行求和。

代码一直有效,直到我高于145(145是第一个具有等于其阶乘数之和的属性的值:145 = 1!+ 4!+ 5!)它给出了错误{ {1}}。

我不知道为什么undefined method '+' for nil:NilClass方法返回answer =equal_to_sum_of_factorial_digits?之后的代码失败了。有人可以开导我吗?

1 个答案:

答案 0 :(得分:1)

这是因为在reduce的前一次迭代中,acc由于被评估为nil而导致nil acc。请注意,{{1}}的值是每次迭代的块的计算值。