SICP練習 85 練習2 57

2021-06-28 22:55:01 字數 1416 閱讀 7950

看到題目中的能處理任意項就趕緊這道題挺難的,同時也想到了前面學過但還沒怎麼用過的點引數。題目中要能求和還能求乘積。我們先來寫求和的函式吧。

(define

(make-sum a1 . a2)

(if (single-operand? a2)

(let

((a2

(car a2)))

(cond

((=number? a10) a2)

((=number? a20) a1)

((and

(number?

a1)(number?

a2))

(+ a1 a2))

(else

(list

『+ a1 a2))))

(cons

『+ (cons

a1 a2))))

隨後的sum?和addend等都不變,而augend則要做點修改了。

(define

(augend s)

(let

((tail-operand

(cadd s)))

(if (single-operand? tail-operand)

(car tail-operand)

make-sum tail-operand))))

寫好了加法就來寫乘積了吧。

(define

(make-sum m1 . m2)

(if (single-operand? m2)

(let

((m2

(car m2)))

(cond

((or

(=number? m10)

(=number? m20))

0)((=number? m11) m2)

((=number? m21) m1)

((and

(number?

m1)(number?

m2))

(* m1 m2))

(else

(list

『* m1 m2))

(cons

『* (cons

m1 m2))))

同樣的,product?和multiplier都不變,而multiplicand則做些變化。

(define

(multiplicand p)

(let

((tail-operand

(cddr p)))

(if (single-operand? tail-operand)

(car tail-operand)

make-product tail-operand))))

SICP練習 85 練習2 57

看到題目中的能處理任意項就趕緊這道題挺難的,同時也想到了前面學過但還沒怎麼用過的點引數。題目中要能求和還能求乘積。我們先來寫求和的函式吧。define make sum a1 a2 if single operand?a2 let a2 car a2 cond number?a10 a2 numbe...

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...