Re: プログラミングと論理学(Re: Re [2]:大文字と小文字の区別)
河野真治 @ 琉球大学情報工学です。
In article <cj07cr$i4k$1@caraway.media.kyoto-u.ac.jp>, <kounoike@mbh.nifty.com> writes
> 質問するのがちょっと恥ずかしいのですが,破壊代入って何なんでしょうか。初めて耳にす
> る言葉なので。それと,プログラムには破壊代入が必要とはどうゆう意味なんでしょうか。
> 分かりやすく説明してもらえれば助かるのですが。
int i;
i = 1;
printf("%d\n",i);
とかだと、i=1 で代入は行われているんですけど、特に前の値が壊れる
ってことはないんですよね。
ですけど、
int i;
i = 1;
do {
i = i + 1;
printf("%d\n",i);
} while( i< 10);
みたいなのだと、i に入っている前の値が上書きされてしまいます。それで
破壊代入とか言います。これを、
loop1(int i) {
if (i<10) {
printf("%d\n",i);
loop1(i+1);
}
}
とかすると、破壊代入抜きで同じことを実現することが出来ます。
(あんまり良い例じゃないけど...)
破壊代入なしだと、変数の値が一つ(これも正確な言い方じゃないけど..)
に決まるので、プログラム自体の理論的なわかりやすさみたいなのが
増します。しかし、一般的にはメモリ領域を多く食うとされています。
リスト処理でも、
入力のリストを複製しながら、出力のリストを作る
というようにすると破壊代入抜きで出来ます。例えば、
list
reverse(list in) {
if (isNull(in)) return in;
else return append(reverse(next(in)),first(in));
}
みたいな感じ。しかし、破壊代入を使うと、もう少しメモリ効率の
良い方法があります。
変数で状態を表すってのは良くありますよね。そういう意味では必
須。なんだけど、メモリコストを払えば、実は不要。しかし、イン
タラクティブあるいはリアルタイムプログラムでは、状態は必須な
ので、破壊代入は必須。そんな関係ですね。
---
Shinji KONO @ Information Engineering, University of the Ryukyus
河野真治 @ 琉球大学工学部情報工学科
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735