SICP 問題 1.30 (抽象的総和演算のsumを末尾再帰にする)

くっそ〜、仕事忙しすぎて帰りがおそくなっちまった。。
3月3日付けでエントリー書けなかったなぁ。

って思ったら3月3日の扱いになってる!
・・・でも記入時刻は0時すぎてんぞ?どーなってんだ?

まぁいいや。

【問題】

上のsumの手続きは線形再帰を生成する。
総和が反復的に実行できるように手続きを書き直せる。
次の定義の欠けているところを補ってこれを示せ。

(define (sum term a next b)
  (define (iter a result)
    (if <??>
        <??>
        (iter <??> <??>)))
  (iter <??> <??>))

【解答】

これも割とすんなり。これぐらいの単純な問題だと末尾再帰の考え方は自然とできるようになったなぁ。

(define (sum term a next b)
  (define (iter a result)
    (if (> a b)
        result
        (iter (next a) (+ result (term a)))))
  (iter a 0))

一応他に必要な関数ももう一度定義して・・・

(define (integral f a b dx)
  (define (add-dx x)
    (+ x dx))
  (* (sum f (+ a (/ dx 2.0)) add-dx b)
     dx))

(define (cube x)
  (* x x x))

読み込ませて実行してみる。


gosh> (integral cube 0 1 0.01)
0.24998750000000042
gosh> (integral cube 0 1 0.001)
0.24999987500000073
gosh>
うん。同じ結果だ。