使用最小测试,我正在尝试通过此测试,要求获得5!
的总和:
def test_sum_of_factorials
sum_of_factorials = 0
numbers = [1, 2, 3, 4, 5]
assert_equal 153, sum_of_factorials
end
我写了一个通过的解决方案,但是它很长且重复:
fractorial_5 = numbers.inject(1) {|aggregate, num| aggregate * num}
fractorial_4 = numbers[0..3].inject(1) {|aggregate, num| aggregate * num}
fractorial_3 = numbers[0..2].inject(1) {|aggregate, num| aggregate * num}
fractorial_2 = numbers[0..1].inject(1) {|aggregate, num| aggregate * num}
fractorial_1 = 1
fractorials_array = [fractorial_1, fractorial_2, fractorial_3, fractorial_4, fractorial_5]
fractorials_array.each {|fractorial| sum_of_factorials += fractorial}
有人愿意解释的更干净,更简单的解决方案吗?
看来您已获得:
def sum_of_factorials(n)
(1..n).reduce([1, 0]) { |(f, sum), e| [(f *= e), (sum + f)] }.last
end
由于您可以写5!+4!+3!+2!+1 !,通常为1!+2!+3!+ ... + n!作为1 + 2(1 + 3(1 + 4(1 + 5(1 + ...(1 + n)))))),您可以在O(n)]中执行此操作
sum_of_factorials = 1
numbers.drop(1).reverse_each { |i| sum_of_factorials = 1 + i * sum_of_factorials }