17.4.26 別の形の繰り返し - その2

少し前に見た整数の和の計算でも, やはり別の形の繰り返しの定義ができます.

整数の和の計算では

と考えて「0からnまでの和」を次のような関数として定義しました.

let rec sum(n) =
  if n=0 then 0
  else (sum(n-1))+n

これを「0からkまでの和がsのときの0からnまでの和」(以降では sum_from(k,s,n) と書くことにします)を求めると考え直すと,

と考えて

let rec sum_from(k,s,n) =
  if k=n then s
  else sum_from(k+1,s+k+1,n)

のように定義することができます. 0から10までの和や, 4567までの和を求めるには sum_from(0, 0, 10)sum_from(0, 0, 4567) という式になります.

この形の繰り返しは一見ややこしいのですが, 次のようなことに気付けば容易に理解できるでしょう.

sum_fromを使って, 「0からnまでの和」を定義し直すと, 次のようになります.

let sum_alt(n) = sum_from(0,0,n)