計算機プログラムの構造と解釈 第二版 P68 問題2.34
この問題も穴埋めだ。
そしてこの問題もaccumulateとにらめっこすることになる。
ポイントは、accumulateは一回展開してから戻ってくる(自分にしか分からない表現)。
再帰プロセスをとる。
あとは記載されているHornerの方法を頭に入れた方がいい。
なにを言ってるかって言うと、具体的に言うと
1 + 3x + 5x^3 + 5x^5
てのはこんな以下のような感じで表現できる
1 + x(3 + x(0 + x(3 + x(0 + 5x))))
これがHornerの方法
あとはぬわーっと考えれば多分解けるはずだ。
実装
#!/usr/local/bin/gosh ;; -*- coding: utf-8 -*- (use ggc.debug.trace) (use math.mt-random) (define nil '()) (define (accumulate op initial sequence) (if (null? sequence) initial (op (car sequence) (accumulate op initial (cdr sequence))))) (define (horner-eval x coefficient-sequence) (accumulate (lambda (this-coeff higher-terms) (+ (* x higher-terms) this-coeff)) 0 coefficient-sequence)) ;; main (define (main args) (display "(horner-eval 2 (list 1 3 0 5 0 1)): ") (display (horner-eval 2 (list 1 3 0 5 0 1))) (newline) 0)
実行
(horner-eval 2 (list 1 3 0 5 0 1)): 79
できた。