problem 2

4000000 以下のフィボナッチ数列の一般項で偶数の合計を求める問題

(define (fib n)
  (define (fib-iter a b count)
    (if (= count 0)
      b
      (fib-iter (+ a b) a (- count 1))))
    (fib-iter 1 0 n))

(define (p2 maxnum)
   (define (p2-iter n sum)
      (let ((fibn (fib n)))
        (if (> fibn maxnum)
          sum
          (p2-iter (+ n 1) (+ sum (if (= (modulo fibn 2) 0)
                                    fibn
                                    0))))))
   (p2-iter 1 0))

(print (p2 4000000))

フィボナッチは再帰ではなくて繰り返しがあることを思い出して SICP からコピペ。コピペいくないけど。scheme で繰り返し書くのはちょっと難しい。

  • 末尾再帰にすること
  • カウンタと計算結果を引数にして次々に渡していくこと

この 2 つが肝要であることは頭では分かっているのだけど。