問題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


再帰的な実装も反復的な実装も、同じ値が返る。

amazon
『計算機プログラムの構造と解釈』