SICP Exercise 2.34
Question
Evaluating a polynomial in \(x\) at a given value of \(x\) can be formulated as an accumulation. We evaluate the polynomial \[a_nx^n+a_{n-1}x^{n-1}+\cdots +a_1x+a_0\]
using a well-known algorithm called Horner’s rule, which structures the computation as \[(\ldots (a_nx+a_{n-1})x+\cdots +a_1)x+a_0\]
In other words, we start with \(a_n\), multiply by \(x\), add \(a_{n-1}\), multiply by \(x\), and so on until we reach \(a_0\).
Fill in the following template to produce a procedure that evaluates a polynomial using Horner’s rule. Assume that the coefficients of the polynomial are arranged in sequence, from \(a_0\) to \(a_n\).
(define
(horner-eval x coefficient-sequence)
(accumulate
(λ (this-coeff higher-terms)
⟨??⟩)
0
coefficient-sequence))
For example, to compute \(1+3x+5x^3+x^5\) at \(x=2\) you would evaluate
(horner-eval 2 (list 1 3 0 5 0 1))
Answer
The question basically tells you exactly how op
should be constructed.
Since op
evaluates the list in reverse order, we can simply start with
this-coeff
and add to it all the higher terms multiplied by x
.
(define (horner-eval x coefficient-sequence)
(accumulate
(λ (this-coeff higher-terms)
(+ (* x higher-terms) this-coeff))
0
coefficient-sequence))
(horner-eval 2 (list 1 3 0 5 0 1))
Results:
79