以下に示すように、特定の順序ではなく、降順のシーケンスとして示されているシーケンスのセットを生成しようとしています。順列ではなく組み合わせに関心があるため、各シーケンスも下降することに注意してください。各シーケンスを配列として保存したいのですが、シーケンスのセットを配列の配列として保存したいのですが、まず最初に。
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
現在、私は単にこれらのセットの生成に焦点を合わせており、それを再帰的に実行しようとしています。基本的に、これらはすべて、組み合わせると合計が得られる数のシーケンスです。この場合は6です。ただし、最初の数が3の場合、後続の数のセットは、単に合計を与えるシーケンスのセットであることに注意してください。 3.言い換えると、6(ターゲット合計)-3(最初の数)= 3(合計3を与えるシーケンスのセット)。したがって、これを再帰的に実行できるはずです。
私は次のようにコーディングしようとしました(そして、はい、これは私の最初の言語であり、はい、私は約1週間しか勉強していないので、すべてが台無しになっていると確信しています)が、これまでのところ運がありません。再帰の核心を機能させ、すべてのオブジェクトの値を画面に表示して、行ごとにトレースできるようになれば、先に進むことができると思いますが、ロジックと構文の間では、じっとしている。
私の論理は次のとおりです。
- 対象となる合計を表す「count」を渡すメソッドを定義します。
- 与えられた値のシーケンスを保持する配列を作成します
- 配列内の位置を表すインデックスを作成します(ゼロ位置を無視します)。
- 'delta'を定義し、それを' count'の値に初期化し、配列の残りの残りのターゲット合計を表すようにします。(最初は配列に何もないため、デルタはカウントと同じです。)
次に、1から始まり、明らかに可能な最大値で終わるシーケンスの次の(最初の)値の可能性を循環します。これは「count」自体の値です。サイクル内の各値の新しいデルタを決定します。
デルタが0の場合は完了です。それ以外の場合は、この新しいデルタを与えるこの新しいシーケンスを決定します。新しいシーケンスを現在のシーケンスにも追加する必要がある可能性があります。
i=0
def seq(count)
cvc=Array.new # array to hold the number values
i=i+1 # position index for the array
puts 'i is ' + i.to_s
delta=count
puts ' delta is ' + delta.to_s
for value in 1..delta do # value represents the number value
cvc[i]=value
puts 'cvc[i] is ' + cvc[i].to_s
delta = delta-cvc.sum
puts 'new delta is '+ delta.to_s
if delta >1 then count=delta
seq(count)
end
end
end