初めての投稿です.Markdown記法も初めて使います.Rubyの上達のためにQiitaを始めました.よろしくお願いします.
$7=3+2+1+1$という7の分割を[3,2,1,1]
という配列で表現することにする.
このとき,自然数$n$の分割を(配列の配列として)辞書式順序ですべて書き出す関数を書いてみた.
split.rb
def split(n)
result=[[n]]
return result if n==1
(1..n-1).each do |i|
y=[]
z=split(i).delete_if{|x| x.max>n-i}
z.each do |x|
y.push(x.insert(0,n-i))
end
y.each do |j|
result.push(j)
end
end
return result
end
p split(6)
#=>[[6], [5, 1], [4, 2], [4, 1, 1], [3, 3], [3, 2, 1], [3, 1, 1, 1], [2, 2, 2], [2, 2, 1, 1], [2, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]]
配列として出力したので,split(n).length
とすることで$n$の分割数がわかる.ただし,分割をすべて求めるという経路をたどっているため,分割数を求めるプログラムとしては遅いと思われる.