繰り返し(iteration)


今回の演習では、関数型プログラミングの学習のため、 代入操作は使っていませんし、このため繰り返し文も教えませんでした。 一応、 do 文の例だけを紹介しておきます。書き方は以下の通りです。

(do ((var1 init1 {step1}) 
     ...
     (varn initn {stepn}))
    (TestCondition ReturnValue)
  body)
まず、変数 var1 .. varn が 初期値 init1 .. initn で生成されます。 その後、繰り返し動作が行われ続けます。 繰り返しの冒頭では、まず式 TestCondition が実行され、成立した場合は 式 ReturnValue の値を返します。 TestCondition に失敗した場合、body 部を実行し、 その後、各変数を stepi の値で更新します(省略されている場合は変更無し)。

たとえば、 1 から n までの足し算を行う関数 sumup は、以下の様に定義できます。


(define (sumup n)
  (do ((counter 1 (+ counter 1))
       (result  0))
      ((> counter n) result)
    (set! result (+ result counter))))
実は、これと、以下の C のプログラムはあまり違いません。

int sumup(int n) {
  int counter;
  int result;
  
  for(counter = 1,result = 0;     /* init: 初期値 */
      !(counter > n);             /* ConditionTest: 繰り返し条件 */
      counter++) {                /* step: 更新値 */

      result = result + counter;  /* body: 繰り返し本体 */
  }
  return result;                  /* ReturnValue: 帰り値 */
}    

99.10.7/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp