Вы можете определить метод, подобный этому, который является многословным, но ясным (я думаю):
def parts_sums(ary, res = [])
res << [ary.dup, ary.sum]
if ary.size > 1
ary.shift
parts_sums(ary, res)
else
return res
end
end
Итак, когда вы вызываете свой массив, вы получаете такой результат:
ary = [0, 1, 3, 6, 10]
parts_sums(ary)
#=> [[[0, 1, 3, 6, 10], 20], [[1, 3, 6, 10], 20], [[3, 6, 10], 19], [[6, 10], 16], [[10], 10]]
Вызовите parts_sums(ary.dup)
, если хотите сохранить исходный массив.
Который можно переписать кратчайшим путем:
def parts_sums_2(ary, res = [])
return res unless ary.any?
res << [ary, ary.sum]
parts_sums_2(ary[1..-1], res)
end