プロが教えるわが家の防犯対策術!

0-5までの数字を使用して
3~10個の数字の組合せを作成したいと思っています。

組合せを書きだしてみたり、
数学やプログラムのページをネットで探してみたのですが
理解力不足でロジックが思いつきませんでした…。

桁数、使用数字の最大値を指定して、
最終的に配列等に持たせる事が目標です…。

3桁,使用数字の最大値2(0-2)の場合
{0,0,0}
{0,0,1}
{0,1,1}
{0,1,2}
{1,1,1}
{0,0,2}
{0,2,2}
{2,2,2}
といった具合です。(漏れていたらすいません…)

ヒントだけでもいただけたらとても助かります。
宜しくお願いいたします。

A 回答 (2件)

生成するデータに抜けがありますね


000
001
002
011
012
022
111
112 ... 1)
122 ... 2)
222
といった具合になるはずです

この場合3重ループで実現可能です
for i = 0 to 2
  for j = i to 2
    for k = j to 2
      cells(nRow,1) = i & " " & j & " " & k
    next
  next
next
といった具合です

これだと桁数と使用数字が固定されてしまいます
再帰処理で記述してやれば 桁数、使用数字を可変にできると思いますよ

sub myCalc( lv as integer, m as integer, nMax as Integer, nRow as Integer, ss as string)
  if lv = 0 then
    ' 再帰の脱出条件
    Cells( nRow, 1 )= ss
    nRow = nRow + 1
    ss = left$(ss, Len(ss)-2)
  else
    dim i as integer
    for i = m to nMax
      ss = ss & i & " "
      ' 1つ下のレベルを呼び出す
      myCalc lv-1, i,nMax, nRow, ss
    next
    if len(ss) < 2 then Exit Sub
    ss = left$(ss, len( ss ) -2 )
  end if
End Sub
といった具合にしておいて
呼び出す側で
myCalc 3, 0, 5, 1, ""
といった具合にします
上記の場合 3桁 0-5を使用 1行目から 初期文字列は"" で呼び出しています
    • good
    • 0
この回答へのお礼

ありがとうございます!
固定のプログラムも、変数呼び出しの再起ロジックも
とても勉強になりました。
教えていただいた考え方を生かして
自分のスキルも上げていきたいと思います。
本当ありがとうございました。

パターン漏れすぎですね…。すいません、、恥ずかしすぎる…。

お礼日時:2009/07/18 17:59

処理的には「進数変換」と同じですね。


コードのロジックについては「進数変換」で検索してみてください。
Hogeの引数にマイナスや大きな数字を指定したときの対処は組み込んでいません。

Option Explicit

Private Sub CommandButton1_Click()
Call Hoge(5, 5)
End Sub


' Digit .... 桁数
' MaxNum ... 最大値
Public Sub Hoge(Digit As Integer, MaxNum As Integer)

Dim i As Long, l As Long
Dim strPattern() As String
Dim lngVal As Long
Dim lngUseNum As Long ' 数字の種類数 (0-5)なら6
Dim lngUBound As Long ' 配列の上限

' 使用する数字の種類は最大値+1
lngUseNum = MaxNum + 1

' 配列の上限
' (使用する数字の種類 ^ 桁数) - 1
lngUBound = (lngUseNum ^ Digit) - 1

ReDim strPattern(lngUBound)


' 進数変換ループ
For i = 0 To lngUBound

lngVal = i

' 各桁の数値を算出
For l = 0 To (Digit - 1)
strPattern(i) = CStr(lngVal Mod lngUseNum) & " " & strPattern(i)
lngVal = lngVal \ lngUseNum
Next

' 結果を見るためにListBoxへ出力
Call ListBox1.AddItem(strPattern(i))

Next

End Sub
    • good
    • 0
この回答へのお礼

なるほど!!!ありがとうございます!
進数変換、自分では絶対にたどり着かなかったと思います。
本当にありがとうございます。
ロジック使わせていただきます!
本当に勉強になりました!

お礼日時:2009/07/18 18:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!