多重ループで?? への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 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
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」です。
下記のように読み替えてください。
《処理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」
>《処理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 行目にある 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回実行されることになるわけです。
それぞれの変数の値を、順番に追っていってみましょう。
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
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
何とか理解することができました。
ありがとうございました。
追伸
この3重ループを使ったプログラムのサンプルがありましたら、見てみたいと思います。