計算機の大きな特徴は,同じことを繰り返すことが高速にできることです.1つの例として,0 + 1 + ...+ 99 + 100 つまり0から100までの和を求めてみましょう.
この和を求める計算は次のように考えることができます.
よく見ると,最後を除けば同じ形をしていますね.ですから,この考え方は次のように書くこともできます.
この考え方は,「0からある数までの和」を「0から1つ小さい数までの和」を使って定義している点がポイントです.このような考え方は,Ocamlでは let rec 名前(変数,変数,..) = 式 という形で定義することができます.
「0からnまでの和」をsum(n)という関数として定義するのであれば,次のようになります.
# let rec sum(n) =
if n=0 then 0
else (sum(n-1))+n;;
val sum : int -> int = <fun>
#
定義の仕方は,いままでの関数の定義とほとんど同じですが,唯一,letの後にrecがあるのだけが違いです.
使い方もいままでの関数と同じです.0から10までの和や4567までの和を求めてみましょう. 因みに0からnまでの和は n×(n+1)÷2 だということが知られていますので,そうやって計算した場合と同じになることも確めておきましょう.
# sum(10) ;;
- : int = 55
# 0+1+2+3+4+5+6+7+8+9+10;;
- : int = 55
# sum(4567) ;;
- : int = 10431028
# 4567*4568/2;;
- : int = 10431028
#
17.4.20 判断と実行 |
![]() |
17.4.21 整数の和 |
![]() |
17.4.22 繰り返しと実行 |
2009年度版に向けて現在作業中です.
このページに関してお気づきの点がありましたら
コメント投稿システムまでお願いします.
|
Mon, 27 Jun 2005 17:28:58 JST (1495d) |