問題1.32
a.
sumと(問題1.31の)productは,一般的なアキュムレーションの関数:
(accumulate combiner null-value term a next b)
を使い,項の集りを組み合せるaccumulateという更に一般的なものの特殊な場合であることを示せ.accumulateは引数としてsumやproductと同様,項と範囲指定と,先行する項のアキュムレーションと現在の項をどう組み合せるかを指定する(二引数の)combiner手続き,項がなくなった時に使う値を指定するnull-valueをとる.accumulateを書き,sumやproductがaccumulateの単なる呼出しで定義出来ることを示せ.
b.
上のaccumulateが再帰的プロセスを生成するなら,反復的プロセスを生成するものを書け.反復的プロセスを生成するなら,再帰的プロセスを生成するものを書け.
--
; --
; 標準的関数をロード
; --
(load "./util.scm")
; --
; 再帰的なaccumulateの実装
; --
(define (accumulate-rec combiner null-value term a next b)
(if (> a b)
null-value
(combiner (term a)
(accumulate-rec combiner null-value term (next a) next b))
)
)
(print "再帰的な実装: " (accumulate-rec + 0 identity 1 inc 10))
; --
; 反復的なaccumulateの実装
; --
(define (accumulate-rep combiner null-value term a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a) (combiner result (term a))))
)
(iter a null-value)
)
(print "反復的な実装: " (accumulate-rep + 0 identity 1 inc 10))実行する。
$ gosh 1.32.scm 再帰的な実装: 55 反復的な実装: 55
再帰的な実装も反復的な実装も、同じ値が返る。

コメント一覧
この記事にコメントしてください
(*) は必須入力項目です。