プログラミング言語SML#解説 3.7.1版
7.15 手続き的制御
手続き的な処理を学んだところで,手続き的な言語での制御構造の記述 と式による関数の記述の関係を振り返ってみましょう. 状態の変更を伴う手続き的処理は,外部の状態を変更するI/Oなどの機能 の表現には欠かせないものです. これらは,手続き的な操作として表現するのがもっとも分かりやすいプ ログラムとなります. 手続き型言語では,これらに加え,ループや条件式などの種々の制御構 造も手続き的な機能で実現されるのに対して,MLでは式の組み合わせで表現され ます. これまで見てきた通り,MLではプログラム構造は手続き的機能に関係の ない概念ですから,表現すべき内容を式で表すMLの方がより宣言的で理解しやす いプログラムと言えます.
しかし,この点に注意が必要です. Cのような手続き型言語では,手続き的処理が基本ですから,階乗を求 める関数factは,再帰ではなく,ループを使って以下のように書くのが一 般的と思われます.
int fact (int n) {
int s = 1;
while (n > 0) {
s = s * n;
n = n - 1;
}
return s;
}
このようにループを使って書くほうが,再帰を使った書き方,たとえば MLでの
fun fact 0 = 1
| fact n = n * fact (n - 1)
のようなコードより効率的です. しかし,この事実は,関数型言語の本質的な非効率さを意味するもので はありません.