• ベストアンサー

組み合わせを抽出するために使う再帰呼び出しについて

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

質問者が選んだベストアンサー

  • ベストアンサー
noname#102340
noname#102340
回答No.2

p1(プログラム1)がp2を呼び出し、p2がp3を呼び出し、という再帰呼び出しをビジュアルで書くと下。 p1始 p2始 p3始 p3終 p2終  p1終 提示されたソースでいうと下(だと思う)。 組み合わせの1桁目をセットするプログラム(プロシージャ)をcombiPr1と書くことにする。 combiPr2が、combiPr3を呼び出しcombiPr3が答えを出力して終了(End Sub)、combiPr2のcombiPr3呼び出し行に戻る。

akiy38
質問者

お礼

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

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

デバッグ時に、呼び出し履歴を参照してみるとわかるかも。 メニューの表示>ツールバ>デバッグをクリック。 で、「呼び出し履歴」で、「どの行から呼ばれているか」が参照できると思います。

akiy38
質問者

お礼

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

関連するQ&A