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

1,2,3,4,5の数列から3の数の組合せをワークシートに表示するプログラムを作っています。
このソースは以前他の質問に載っていたものを自分用に多少アレンジしたものです。構造は再帰呼び出しを使って、123、124、125、134、135、145、234、235…345という形で結果を出力します。いろいろと試してみて、計算結果は正しいとわかったのですが、デバックをしていて1つどうしても理解できないことがありました。計算結果が145から234になるとき、カーソルがSub combiPrのEnd subを指したあと直前のEnd ifに移ります。その後Forに移って234以降の計算を始めます。どうしてEnd Subからこのような動作をするのかわかる方いらっしゃいましたら是非ワケを教えてください。よろしくお願いしますm(_ _)m
Const m As Integer = 3 '←取り出す個数
Const n As Integer = 5 '←サンプル数
Dim rStr As String
Dim mRow As Integer
Dim Nest As Integer
Dim A(10) As Variant
Sub combi()

Cells.ClearContents
mRow = 0
Nest = 0
combiPr (0)

End Sub
Sub combiPr(n1)
Dim mCol As Integer
For nn = n1 + 1 To n - m + Nest + 1

Nest = Nest + 1
A(Nest) = nn
If Nest = m Then
mRow = mRow + 1
For mCol = 1 To m
Worksheets(1).Cells(mRow, mCol).Value = A(mCol)
Next
Else
Call combiPr(nn)
End If

Nest = Nest - 1
Next nn
End sub

A 回答 (2件)

p1(プログラム1)がp2を呼び出し、p2がp3を呼び出し、という再帰呼び出しをビジュアルで書くと下。



p1始
p2始
p3始
p3終
p2終 
p1終

提示されたソースでいうと下(だと思う)。
組み合わせの1桁目をセットするプログラム(プロシージャ)をcombiPr1と書くことにする。
combiPr2が、combiPr3を呼び出しcombiPr3が答えを出力して終了(End Sub)、combiPr2のcombiPr3呼び出し行に戻る。
    • good
    • 0
この回答へのお礼

なるほど!わかりやすい御説明ありがとうございました。私の再帰呼び出し文の理解が不十分だったようです。呼び出す前のプロシージャが生きていることを忘れていました。ありがとうございました。

お礼日時:2009/12/19 13:10

デバッグ時に、呼び出し履歴を参照してみるとわかるかも。



メニューの表示>ツールバ>デバッグをクリック。
で、「呼び出し履歴」で、「どの行から呼ばれているか」が参照できると思います。
    • good
    • 0
この回答へのお礼

初めて知りました。とても便利な機能だと思います。ただ、再帰プログラムにトレースは、私にはややこしすぎました(ToT)ありがとうございました。

お礼日時:2009/12/19 13:06

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