SICP 問題 2.34(Hornerの方法)
【問題】
x の多項式の、ある x の値での評価は、アキュムレーションとして形式化できる。多項式
は、計算を
a_n・x^n + a_(n-1)・x^(n-1) + … + a_1・x + a_0
と構造化する Horner の方法(Horner's rule)としてよく知られたアルゴリズムで評価する。
(… (a_n・x + a_(n-1))・x) + … + a_1)・x + a_0
つまり、a_n から初め、x を掛け a_(n-1)を足し、x を掛け、これを a_0 になるまで繰り返す。
下の雛形を補って、Horner の方法で多項式を評価する手続きを作れ。
多項式の係数は a_0 から a_n の順に、並びに配置されていると仮定せよ。
(define (horner-eval x coefficient-sequence) (accumulate (lambda (this-coeff higher-terms) <??>) 0 coefficient-sequence))
例えば x = 2 で、1 + 3x + 5x^3 + x^5 の計算は、
1 + 3x2 + 5x8 + 32
1 + 6 + 40 + 32
79
(horner-eval 2 (list 1 3 0 5 0 1))
と評価する。
【解答】
例によって accumulate の定義を。
(define (accumulate op initial sequence) (if (null? sequence) initial (op (car sequence) (accumulate op initial (cdr sequence)))))
で、Horner の方法を完成させるとこんな感じ
(define (horner-eval x coefficient-sequence) (accumulate (lambda (this-coeff higher-terms) ;x と係数を掛け合わせ、現在の累積値に加算する感じ。 (+ (* x higher-terms) this-coeff)) 0 coefficient-sequence))
では実験。
合ってるねぇ。
gosh> (horner-eval 2 (list 1 3 0 5 0 1))
79
gosh> (horner-eval 2 (list 2 3 1 5 0 1))
84
gosh>