Project Euler: Problem 2

Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

Find the sum of all the even-valued terms in the sequence which do not exceed four million.

http://projecteuler.net/index.php?section=problems&id=2

フィボナッチ数列の中に現れる偶数の項の合計値を 4,000,000 を超えない範囲で求めよとのこと。

例のごとく Scheme で書いてみた。何も考えずに (+ (fibonacci (- n 2)) (fibonacci (- n 1))) とかやるのもアレだと思って書き直してたらちょっと手間取ってしまった。

#!/usr/bin/env gosh

(define (fibonacci n)
  (if (< n 1)
    0
    (let loop ((n n)  ; n 番目のフィボナッチ数
               (r 1)  ; 合計 (初期値は 1; 1 番目のフィボナッチ数列の値)
               (m 0)) ; フィボナッチ数列を逆順に計算するため、現在の値を保存する
      (if (< 1 n)
        (loop (- n 1) ; n - 1 番目のフィボナッチ数を求める
              (+ r m) ; r (現在のフィボナッチ数) と m (直前のフィボナッチ数) を足す
              r)      ; 現在のフィボナッチ数を次の計算のために保存
        r))))

(define (main args)
  (let loop ((n 1)
             (s 0)) ; 合計
    (let ((f (fibonacci n)))
      (if (< f 4000000)
        (loop (+ n 1)
              (if (even? f) ; 偶数の場合のみ合計にフィボナッチ数を加算する
                (+ s f)
                s))
        (print s))))
  0)