sicp每日一题[2.32]

上一道题没什么改动,再来一道

Exercise 2.32

We can represent a set as a list of distinct elements, and we can represent the set of all subsets of the set as a list of lists. For example, if the set is (1 2 3), then the set of all subsets is (() (3) (2) (2 3) (1) (1 3) (1 2) (1 2 3)). Complete the following definition of a procedure that generates the set of subsets of a set and give a clear explanation of why it works:

(define (subsets s)
  (if (null? s)
      (list nil)
      (let ((rest (subsets (cdr s))))
        (append rest (map <??> rest)))))

这道题有一定难度,要注意到题目里面缺少对 (car s) 的处理,我们每次求 (cdr s) 的子集后要跟 (car s) 拼一下。

(define (subsets s)
  (if (null? s)
      (list nil)
      (let ((rest (subsets (cdr s))))
        (append rest (map (lambda (x) (cons (car s) x)) rest)))))


(subsets (list 1 2 3))

; 执行结果
'(() (3) (2) (2 3) (1) (1 3) (1 2) (1 2 3))
posted @ 2024-09-28 08:40  再思即可  阅读(1)  评论(0编辑  收藏  举报