LISPのループの考え方

Javaっぽく書くこんなフィボナッチ。

int fib(int n){
  int pre = 0;
  int result = 1;
  for(int i = n; i != 0; --i){
    int tmp = result;
    result = result + pre;
    pre = tmp;
  }
  return result;
}

変数はすべて引数として定義する

(define (fib-iter pre result i) )

初期値を設定

(define (fib n)
  (fib-iter 0 1 n)) ; pre = 0, result = 1, i = n
(define (fib-iter pre result i) )

ループ条件のifをつける

(define (fib n)
  (fib-iter 0 1 n))
(define (fib-iter pre result i)
  (if (= i 0)
    x
    x))

成り立ったときは結果を返してループを終わり、成り立たなかったときは自分自身を呼び出してループを続ける

(define (fib n)
  (fib-iter 0 1 n))
(define (fib-iter pre result i)
  (if (= i 0)
    result
    (fib-iter x x x)))

変数への代入を関数呼び出しの引数に置き換える

(define (fib n)
  (fib-iter 0 1 n))
(define (fib-iter pre result i)
  (if (= i 0)
    result
    (fib-iter
      result          ; pre = result
      (+ pre result)  ; result = pre + result
      (- i 1)         ; i = i - 1
    )))