1

1から6の範囲の整数から長さ3の一意のサブセットを生成しようとしています。以下のスクリプトの多くのバージョンを試してみましたが、常に何らかの問題が発生しているようです。誰かが私にいくつかの指針を与えることができれば素晴らしいでしょう。ありがとう。

Sub permuteTest()

num = 6
cRow = 1

For i = 1 To num - 2

    For j = 2 To num - 1

        For k = 3 To num

            Cells(cRow, 1).Value = i
            Cells(cRow, 2).Value = j
            Cells(cRow, 3).Value = k

            cRow = cRow + 1

        Next k
    Next j
Next i

End Sub
4

2 に答える 2

1

そのようです:

Sub permuteTest()

num = 6
cRow = 1

    For i = 1 To num - 2
        For j = i + 1 To num - 1
            For k = j + 1 To num
                Cells(cRow, 1).Value = i
                Cells(cRow, 2).Value = j
                Cells(cRow, 3).Value = k

                cRow = cRow + 1
            Next k
        Next j
    Next i

End Sub
于 2012-04-21T05:24:38.817 に答える
1

このルーチンは解決方法を示しています。文字列タプル「3,4,1」を生成しますが、必要に応じて配列を使用するように修正できます。読むのは簡単ではありませんが、ステップスルーすればすべてが明確になります。コンパクトにするために、変数を宣言しなかったので、Option Explicit なしで実行します。

Const T = 3 ' generate 3-tuples
Const N = 6 ' using digits 1,...,6

Private Sub Permute()
    Dim cTuples As New Collection: Call cTuples.Add(Empty)      ' start w empty tuple (rank 0)
    For i = 1 To T: Set cTuples = NewTuples(cTuples, N): Next i ' increase tuple rank T times using N digits
    For Each vTuple In cTuples: Debug.Print vTuple: Next        ' display the results
End Sub

' helper func: turn a set of T-tuples into T+1 tuples
Private Function NewTuples(Tuples As Collection, N As Integer) As Collection
    Set NewTuples = New Collection
    For Each vOldTuple In Tuples
        For i = 1 To N: NewTuples.Add (AppendToTuple(vOldTuple, i)): Next
    Next
End Function

' helper func: turn a single T tuple into a T+1 tuple
Private Function AppendToTuple(Tuple, i)
    If IsEmpty(Tuple) Then AppendToTuple = i Else AppendToTuple = Tuple & "," & i
End Function

結果の文字列タプル debug.print'ed を Immed Window (ctrl-G):

1,1,1
1,1,2
1,1,3
1,1,4
1,1,5
1,1,6
1,2,1
1,2,2
...
6,6,5
6,6,6
于 2012-04-21T05:41:11.487 に答える