頭の整理

頭の中を整えるために,色々と書き綴ります

多重ループと単一ループ

プログラミングをしていると,ループの中にループが含まれる”多重ループ”と呼ばれる構造にしばしば出くわします.多重ループはFOR~NEXT文やDO~LOOP文を入れ子にして記述することが多いです.例えば,3次元配列Qの値をPに代入する場合,FOR~NEXT文を用いた次のような3重ループが用いられます.

 

FOR I=1 TO L

 FOR J=1 TO M

  FOR K=1 TO N

   P(I,J,K)=Q(I,J,K)

  NEXT K

 NEXT J

NEXT I

 

ところで,上に示した3重ループ構造は1つのDO~LOOP文と2つのIF文を用いて次のように記述することもできます.

 

I=1

J=1

K=1

DO

 P(I,J,K)=Q(I,J,K)

 K=K+1

 IF K>N THEN

  K=1

  J=J+1

 END IF

 IF J>M THEN

  J=1

  I=I+1

 END IF

LOOP UNTIL I>L

 

また,1つのGOTO文と3つのIF文を用いて次のように記述することもできます.

 

I=1

J=1

K=1

10

 P(I,J,K)=Q(I,J,K)

 K=K+1

 IF K>N THEN

  K=1

  J=J+1

 END IF

 IF J>M THEN

  J=1

  I=I+1

 END IF

 IF I<L THEN

  GOTO 10

 END IF

 

上に示した3つのプログラムは,いずれもループを脱出するための条件式を3つ含んでいるという点が共通しています(FOR~NEXT文やDO~LOOP文はそれ自体に条件式を含んでいます).ただ,一見すると始めに示したプログラムは3重ループで,後の2つは単一ループに見えます.この見え方の違いは次の図によって説明できます.

f:id:todayf0rmu1a:20190314010951p:plain

この図はL=5,M=4,N=2のときに,上に示したプログラムが取る構造の概念図です.黒線はIを変数とするループ,青線はJを変数とするループ,ピンクの線はKを変数とするループを表し,黄色の点は条件式が適用される場所を表します.左側の図では3重ループが明らかですが,右側の図は1本の紐に見えます.しかし,右側の図は左側の図の3重ループを点Oで切ってほどいたもので,両者は同じものからできています.そのため,右側の図の左上の矢印から出発して右下の矢印に抜けることは,左側の図の3重ループを1周することと同じことになります.そこで,右側の図の紐の両端を繋いで単一ループを作ると,これは左側の図の3重ループと等しくなります.これが,上に示したプログラムの見え方が異なる理由になります.

 

 

「Amazon.co.jpアソシエイト」