sicp每日一題[2.33]

再思即可發表於2024-09-29

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

相關文章