объекты и клоны в Ruby
при создании функции combos, я бы хотел получить результат разложения числа 4 (например) на слагаемые:
[[1, 1, 1, 1], [2, 1, 1], [2, 2], [3, 1], [4]]
но я получаю:
[[2, 1, 1, 0], [2, 2, 0], [3, 1], [4, 0], [4]]
проблема решается, если res << partition заменить на res << partition.dup
мой код
def solve part
return nil if part.size == 1
min_index = part.index(part[0...-1].min)
part[min_index] += 1
part[-1] -= 1
part[0..min_index] + [1] * part[min_index + 1..-1].sum
end
def combos(n)
res = []
partition = [1] * n
loop do
break if partition.nil?
res << partition
partition = solve partition
end
res
end
хотелось бы узнать зачем надо добавлять копию объекта
Ответы (1 шт):
Автор решения: Василиса
→ Ссылка
Всё просто: в solve вы мутируете тот же самый partition, который только что положили в результирующий массив.