Exercise 2.33
Fill in the missing expressions to complete the following definitions of some basic list-manipulation operations as accumulations:
; p 表示一個函式,sequence 表示一個列表
; 這個函式將對列表中每一個元素進行 p 操作
(define (map p sequence)
(accumulate (lambda (x y) <??>) nil sequence))
(define (append seq1 seq2)
(accumulate cons <??> <??>))
(define (length sequence)
(accumulate <??> 0 sequence))
這道題還是有一定難度的,尤其是第一個
(map p sequence)
,我開始沒明白它的意思,不知道 lambda 兩個引數要幹嘛,所以先做的後面2個,做到第三個的時候才發現是 accumulate 函式中 op 函式需要2個引數,明白了這一點,剩下的就比較好處理了,x 就表示當前要處理的項,y 就是原函式中的遞迴項。
(define (map p sequence)
(accumulate
(lambda (x y) (if (null? x) y (cons (p x) y)))
nil
sequence))
(define (append seq1 seq2)
(accumulate cons seq2 seq1))
(define (length sequence)
(accumulate
(lambda (x y) (if (null? x) y (+ y 1)))
0
sequence))
(define odds (list 1 3 5 7 9))
(define evens (list 2 4 6 8 10))
(map square odds)
(map sqrt evens)
(append odds evens)
(length odds)
; 執行結果
'(1 9 25 49 81)
'(1.4142156862745097 2.0000000929222947 2.4494897427875517 2.8284271250498643 3.162277665175675)
'(1 3 5 7 9 2 4 6 8 10)
5