多重ループで?? への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 デフォルト  (社会人) 投稿日時 2009/3/15 18:05:20
cupidさん、魔界の仮面弁士さん、懇切丁寧におしえていただき感謝しています。

何とか理解することができました。
ありがとうございました。

追伸
この3重ループを使ったプログラムのサンプルがありましたら、見てみたいと思います。

投稿者 cupid  (社会人) 投稿日時 2009/3/15 10:29:15
そういうトリッキーな雰囲気のループは避ける方が良いと思いますが、逆行列の計算のようなソフトの場合など避けられないケースもあるかもしれません。何回ループするかはパッと見て分からないのが普通でしょうから、次の様な図解はどうでしょうか。無記入は同じ値が続くと考えてください。

i  j  k  ステートメント
1       通らず
2  2  1  通る1
     2  通る2
3  2  1  通る3
     2  通る4
   3  1  通る5
     2  通る6
     3  通る7
4  2  1  通る8
     2  通る9
   3  1  通る10
     2  通る11
     3  通る12
   4  1  通る13
     2  通る14
     3  通る15
     4  通る16
投稿者 (削除されました)  () 投稿日時 2009/3/15 10:27:58
(削除されました)
投稿者 (削除されました)  () 投稿日時 2009/3/15 10:23:40
(削除されました)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/3/15 04:56:14
おおぅ、書き間違えていますね。すみません。
下記のように読み替えてください。

《処理3》i = 3 です。
 2 行目は「For j = 2 To 3」の意味になるので、J のループが 2 回動作します。
 3 行目は「For k = 1 To 2」と「For k = 1 To 3」のループとなります。

《処理4》i = 4 です。
 2 行目は「For j = 2 To 4」の意味になるので、J のループが 3 回動作します。
 3 行目は「For k = 1 To 2」と「For k = 1 To 3」と「For k = 1 To 4」です。
投稿者 デフォルト  (社会人) 投稿日時 2009/3/14 18:50:05
毎回、愚鈍な私のために有り難うございます。

>《処理4》i = 4 です。
> 2 行目は「For j = 2 To 3」の意味になるので、J のループが 3 回動作します。

   もしや For j = 2 To 4の間違いでは?

> 3 行目は「For k = 1 To 2」と「For j = 1 To 3」と「For j = 1 To 4」です。
 For k As Integer = 1 To j
  For k As Integer = 1 To (2 To 4)ということですよね。

これがなぜ下記のようになるのか、いまひとつピンときません。
「For k = 1 To 2」と「For j = 1 To 3」と「For j = 1 To 4」
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/3/14 06:11:56
> 下記のコードは、16回実行されるとのことですが、よくわかりかねます。

それぞれの変数の値を、順番に追っていってみましょう。

1: For i As Integer = 1 To 4
2: For j As Integer = 2 To i
3:  For k As Integer = 1 To j
4:   '<ステートメントブロック> 
5:  Next
6: Next
7: Next



1 行目にある I のループが、4 回処理されることは分かりますよね。
その 4 回の間に、i, j, k のループカウンタは、以下のように動作します。


《処理1》i = 1 です。
 2 行目は「For j = 2 To 1」の意味になるので、J, K のループが
 実行されることなく、7 行目で i = 2 に増加します。

《処理2》i = 2 です。
 2 行目は「For j = 2 To 2」の意味になるので、J のループは 1 回だけ動作します。
 3 行目は「For j = 1 To 2」の意味になり、K のループが 2 回動作します。
 ※ ステートメント 1回目:(i, j, k) = (2, 2, 1)
 ※ ステートメント 2回目:(i, j, k) = (2, 2, 2)

《処理3》i = 3 です。
 2 行目は「For j = 2 To 3」の意味になるので、J のループが 2 回動作します。
 3 行目は「For k = 1 To 2」と「For j = 1 To 3」のループとなります。
 ※ ステートメント 3回目:(i, j, k) = (3, 2, 1)
 ※ ステートメント 4回目:(i, j, k) = (3, 2, 2)

 ※ ステートメント 5回目:(i, j, k) = (3, 3, 1)
 ※ ステートメント 6回目:(i, j, k) = (3, 3, 2)
 ※ ステートメント 7回目:(i, j, k) = (3, 3, 3)

《処理4》i = 4 です。
 2 行目は「For j = 2 To 3」の意味になるので、J のループが 3 回動作します。
 3 行目は「For k = 1 To 2」と「For j = 1 To 3」と「For j = 1 To 4」です。
 ※ ステートメント 8回目:(i, j, k) = (4, 2, 1)
 ※ ステートメント 9回目:(i, j, k) = (4, 2, 2)

 ※ ステートメント10回目:(i, j, k) = (4, 3, 1)
 ※ ステートメント11回目:(i, j, k) = (4, 3, 2)
 ※ ステートメント12回目:(i, j, k) = (4, 3, 3)

 ※ ステートメント13回目:(i, j, k) = (4, 4, 1)
 ※ ステートメント14回目:(i, j, k) = (4, 4, 2)
 ※ ステートメント15回目:(i, j, k) = (4, 4, 3)
 ※ ステートメント16回目:(i, j, k) = (4, 4, 4)


よって、合計 16回実行されることになるわけです。
投稿者 デフォルト  (社会人) 投稿日時 2009/3/14 04:18:57
多重ループでつまずいてます。 

For i As Integer = 1 To 3

            For j As Integer = 2 To 5
        <ステートメントブロック>
            Next

        Next

上記の場合は、iが1のときに、jが2~5に変化し、iが2のときは再度jが2~5に変化する
これを繰り返してステートメントブロックは12回実行されることは理解できましたが

下記のコードは、16回実行されるとのことですが、よくわかりかねます。
おしえてください。

        For i As Integer = 1 To 4
            For j As Integer = 2 To i
                For k As Integer = 1 To j
          <ステートメントブロック>

                Next
            Next

        Next