sicp習題2 2節嘗試解答

2021-08-29 08:26:02 字數 2800 閱讀 7982

習題2.17,直接利用list-ref和length過程

(define (last

-pair items)

(list (list

-ref items (

-(length items) 

1))))

習題2.18,採用迭代法

(define (reverse

-list items)

(define (reverse

-iter i k)(if

(null

?i) k (reverse

-iter (cdr i) (cons (car i) k))))

(reverse

-iter items ()))

習題2.20,如果兩個數的奇偶相同,那麼他們的差模2等於0,根據這一點可以寫出:

(define (same

-parity a . b)

(define (same

-parity

-temp x y)

(cond ((

null

?y) y)((=

(remainder (

-(car y) x) 2) 

0)(cons (car y) (same

-parity

-temp x (cdr y))))

(else

(same

-parity

-temp x (cdr y)))))

(cons a (same

-parity

-temp a b)))

利用了基本過程remainder取模

習題2.21,遞迴方式:

(define (square

-list items)(if

(null

?items)

items 

(cons (square (car items)) (square

-list (cdr items)))))

利用map過程:

(define (square

-list items)

(map square items))

習題2.23,這與ruby中的each是一樣的意思,將操作應用於集合的每個元素:

(define (

for-

each proc items)

(define (

for-

each

-temp proc temp items)(if

(null

?items)#t(

for-

each

-temp proc (proc (car items)) (cdr items))))

(for

-each

-temp proc 

0items))

最後返回true

習題2.24,盒子圖就不畫了,麻煩,直譯器輸出:

welcome to drscheme, version 

360.

language: standard (r5rs).

>

(list 

1(list 

2(list 34

)))(1(

2(34

))) 樹形狀應當是這樣

習題2.25,

第乙個list可以表示為(list 1 3 (list 5 7) 9)

因此取7的操作應當是:

(car (cdr (car (cdr (cdr (list 13

(list 57

) 9))))))

第二個list表示為:(list (list 7))

因此取7操作為:

(car (car (list (list 

7))))

第三個list可以表示為:

(list 

1(list 

2(list 

3(list 

4(list 

5(list 67

))))))

因此取7的操作為:

(define x (list 

1(list 

2(list 

3(list 

4(list 

5(list 67

)))))))

(car (cdr (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr x))))))))))))

夠恐怖!-_-

習題2.26,純粹的動手題,就不說了

習題2.27,在reverse的基礎上進行修改,同樣採用迭代,比較難理解:

(define (deep

-reverse x)

(define (reverse

-iter rest result)

(cond ((null? rest) result)

((not

(pair? (car rest)))

(reverse

-iter (cdr rest)

(cons (car rest) result)))

(else

(reverse

-iter (cdr rest)

(cons (deep

-reverse (car rest)) result)))

))(reverse

-iter x ()))

else

(list x))))

dennis 2007-06-12 09:55

sicp 3 1 1小節習題嘗試解答

這一節主要是介紹區域性狀態變數,介紹了set 和begin的語法,看來ruby使用 號來表示改變變數值不是什麼新鮮主意。習題3.1,不解釋了 習題3.1 define make accumulator init define accumulator num set init init num ini...

SICP習題1 6的解答

sicp就是名著 structure and interpretation of computer programs 著名的巫師書 wizard book 和紫書 purple book 雖說英文原版可以從網上合法 中文版翻譯也還不錯。閒話少敘,下面我們研究一下書中 1.1.7節的練習題1.6。原題...

SICP習題解答1 1 1 8

lang racket exercise 1.1 10 5 3 4 9 1 6 2 2 4 4 6 define a 3 define b a 1 a b a b a b if and b a b a b ba cond a 4 6 b 4 6 7 a else 25 2 if b a b a co...