SICP練習 63 練習2 34

2021-09-23 22:50:14 字數 667 閱讀 8557



練習2.34

書中一開始有2個式子,乙個是原式,乙個根據horner規則構造出的式子。而我們同樣也可以將待求得式子寫成這種方式,而且可以更進一步——那就是寫成lisp的前序表示:

(+ 1 (* x (+ 3 (* x (+ 0 (* x (+ 5 (* x(+ 0 x) ) ) ) ) ) ) ) )

由此可以觀察得出lambda表示式裡要做的是:

(+ this-coeff (* x (accumulate ......

通過不斷的遞迴,最終就像上一題中所示的一樣,accumulate最終會返回乙個值,然後就開始計算不再遞迴了,空間需求也就開始縮小。

(define (horner-eval xcoefficient-sequence)

(accumulate (lambda (this-coeff higher-terms)

(+ this-coeff (* xhigher-terms)))

0coefficient-sequence))

下面我們來測試一下。

(load 「d:\\lisp\\accumulate-2.scm」)

(load 「d:\\lisp\\horner-eval.scm」)

(horner-eval 2 『(1 3 0 5 0 1))

;value: 79

SICP練習 7 練習1 11

這種題目太像是數學題目了,不過拿到程式設計上又有一些的難度。我們先根據題目中的條件,寫出類似於第 25頁最下面的變換規則。我們先列出如下內容 a f n 1 f 2 f 3 f 4 f 5 b f n 2 f 1 f 2 f 3 f 4 c f n 3 f 0 f 1 f 2 f 3 於是繼而得出下...

SICP練習 12 練習1 18

練習1.8 和前兩題一樣,依舊是只能用對數步數。而且這個迭代過程要基於加 加倍和折半運算。這乙個習題要用到前面的函式,因此最好的做法是,每次都將寫好的 儲存起來。load test1.18.scm 這行 可以用來載入 而儲存可以用c x,c w。以下是該題的 這次我們寫成塊結構 define x y...

SICP練習 17 練習1 23

練習1.23 首先我們按照題目要求來寫出相應的next函式,然後再修改find divisor函式。define next x if x 2 3 n 2 define find divisor ntest divisor cond square test divisor n n divides?te...