[programming] 繰り返しでフィボナッチ数

id:higepon:20060416:1145173653 から

フィボナッチ数を計算する関数を、繰り返し(iteration)をつかって定義しなさい。再帰版は次の通り。
(define (fib n)
  (cond
   ((= n 1) 1)
   ((= n 2) 1)
   (else (+ (fib (- n 1))(fib (- n 2))))))

チャレンジしてみた。こんな感じかな。

(define (fib n)
  (define (iter a b count max-count)
    (if (> count max-count)
        b
        (iter b (+ a b) (+ count 1) max-count)))
  (iter 1 1 3 n))

iter 中の条件分岐を減らすために、繰り返しは count = 3 から開始。
どうせだから Haskell 版も

fib = iter 1 1 3
 where iter a b count max
         | count > max = b
         | otherwise = iter b (a + b) (count + 1) max

演算子が中置だからか Scheme よりはるかに見やすい気がする。