連載
» 2014年05月09日 10時00分 UPDATE

無償ソフトで技術計算しよう【プログラミング基礎編】(2):forやwhileで繰り返し処理させてみる (1/2)

今回は、繰り返し処理をさせるためのコマンドや、処理を中断したい場合について解説する。forコマンドでは、「最初に与えられた条件に従った回数だけ繰り返す」のに対して、whileコマンドでは「繰り返しの都度繰り返しするかどうかを指示する」ことが可能だ。

[伊藤孝宏,MONOist]

 前回は、プログラミングの方法や基本的なコマンドについて解説しました。今回は「for」コマンド、「while」コマンドについて説明します。いずれも繰り返し処理をさせるために用いられます。forコマンドでは、「最初に与えられた条件に従った回数だけ繰り返す」のに対して、whileコマンドでは「繰り返しの都度繰り返しするかどうかを指示する」ことが可能です。

筆者注:FreeMatはコマンド入力後にエンターキーを押すとコマンドを実行します。本連載ではエンターキーの記述を省略しますが、操作の際にはコマンド入力後にエンターキーが必要です。



forコマンド

 forコマンドも基本的なコマンドの1つであるため、ヘルプの記述をそのまま下記に示します。

The for loop executes a set of statements with an index variable looping through each element in a vector. The syntax of a for loop is one of the following:

for (variable=expression)

statements

end

Alternately, the parenthesis can be eliminated

for variable=expression

statements

end

 意味は、「forループはループ内の処理をベクトル内の要素をインデックスとして順に動作させます。書式は以下の通りです。forコマンドの後の()を付けずに記述することも可能です」ということです。

 C言語などは、forコマンドは「初期化式」「継続条件」「再初期化式」とします。つまりスカラー変数(1つの変数で1つの値を記録)が変化します。これに対して、FreeMatのforコマンドのインデックスはベクトルで与えられ、順に要素を取り出して実行させます。そのため、for n=1:5のように記述します。この場合、nは1〜5に変化するわけではなく、[1,2,3,4,5]というベクトルの先頭から順に要素を取り出します。

 ちなみに、CやJavaの配列のインデックス(複数の変数をまとめて扱う場合、[ ]内にインデックスを指定する)は0から始まるのに対して、FreeMat(MATLABも)の配列のインデックスは1から始まります。従って、配列要素をインデックスで処理するような場合、forコマンドのインデックスは1から始まる値とした方が便利です(関連記事:配列とループ処理を理解しよう

 例として、フィボナッチ数列を求めてみます。フィボナッチ数列とは、以下の漸化式を満足する数列です。

yk_FreeMat_pro02_siki01.jpg

 漸化式に従って、プログラムを作成すると、ex303.mとなり、実行すると、「1 1 2 3 5 8 13 21 34 55」と10項のフィボナッチ数列が得られます。

clear;
f(1)=1;f(2)=1;
for n=3:10
    f(n)=f(n-1)+f(n-2);
end
disp(f)
ex303.m

>>「ex303.m」ダウンロード

 ex303.mはプログラムとして間違いではありませんが、FreeMat(MATLABも)では、配列の要素数が変化すると、その都度メモリを確保します。ex303.mでは、「f(n)=f(n-1)+f(n-2)」の部分で、nの増加に伴い、fの要素数が増加し、コンピュータ内部では新たなfとして定義しています。これは、郵便配達が手紙を1通配達するごとに郵便局に次の手紙を取りに戻るようなもので、計算効率が悪くなります。

 そこで、あらかじめ配列fを要素が0の配列として定義しておき、forループ内では要素を置き換える操作とさせます。ex303.mの例では、最初にf=zeros(1,10);として要素0の1行10列の配列を用意します。こうすると、forループ内のf(n)=f(n-1)+f(n-2)は新たな配列を作らず、単に要素を置き換えるだけの動作となります。参考までにex304.mとして下記に示します。

clear;
f=zeros(1,10);
f(1)=1;f(2)=1;
for n=3:10
    f(n)=f(n-1)+f(n-2);
end
disp(f)
ex304.m

>>「ex304.m」ダウンロード

whileコマンド

 whileコマンドも基本的なコマンドの1つであるため、ヘルプの記述をそのまま下記に示します。

The while loop executes a set of statements as long as the test condition remains true. The syntax of a while loop is

while test_expression

statements

end

Note that a conditional expression is considered true if the real part of the result of the expression contains any non-zero elements (this strange convention is adopted for compatibility with MATLAB).

 意味は、「whileループは、test_expressionがtrueであるかぎり、statementsを繰り返し実行します。継続条件は、実部が0を含まない限りtrueと見なします。これは、MATLABの仕様に合わせたため」となります。

 ifコマンドと同じで、実部が0の要素があると「false」(偽)となり、全ての要素の実部が0以外であれば、「true」(真)となります。従って、whileの条件には論理式の他に数式も用いることが可能です。その場合、計算結果が0となると、whileループは終了します。

 例として、ex304.mをwhileループで書き直すと、下記のex305.mとなります。whileの後の条件はn=11で停止させればよいので、while 11-nとしても同じように動作します。

clear;
f=zeros(1,10);
f(1)=1;f(2)=1;n=3;
while n<=10
    f(n)=f(n-1)+f(n-2);
    n=n+1;
end
disp(f)
ex305.m

>>「ex305.m」ダウンロード

 forループは漸化式(新しい結果は手前の結果に処理を加えたという形の式)の計算に向いています。例えば、n個の中からr個を選ぶ組み合わせの数は下記の式となります。

yk_FreeMat_pro02_siki02.jpg

 「!」は階乗(1〜nまでの自然数の総乗)で、上記の式を大きなnやrで計算すると非常に大きな値の計算となります。そこで、漸化式で表して、小さな値から目標のnやrまで計算します。nCrの漸化式は下記となります。

yk_FreeMat_pro02_siki03.jpg

 nC0からnC1を計算し、nC1からnC2を計算し...と、目標のrまで計算します。漸化式を用いて、10C5を計算させてみたのがex306.mです。ex306.mを動作させると、10C5=252と表示されます。

clear;
n=10;r=5;
p=1;
for k=1:r
    p=p*(n-k+1)/k;
end
printf('%dC%d=%d\n',n,r,p);
ex306.m

>>「ex306.m」ダウンロード

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.