本文主要是介绍sicp 习题2.32,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这题真的不会 参考了一下别人的:
(define (subsets s)(if (null? s)(list null)(let ((rest (subsets (cdr s))))(append rest (map (lambda(x) (cons (car s) x)) rest)))))和换零钱问题的思路是一样的,对于一个集合的所有子集的集合,可以分为两部分,含有第一个元素和不含第一个元素的集合。而且含第一个元素的所有子集除去第一个元素,恰好正是所有不含第一个元素的子集。
也可以换个思路,对于集合A,设它可以表示为 (a1)∪(a2,...,an) ,而 (a2,...,an) 的所有子集的集合是 B=(B1,...Bm),那么可以证明A的所有子集的集合 C=B∪((A1)∪B1,(A1)∪B2,...,(A1)∪Bm);
证明:设 X 是 A 的一个子集,那么如果 a1∈X,那么 X∈((A1)∪B1,(A1)∪B2,...,(A1)∪Bm),否则X∈B,所以X∈C
这篇关于sicp 习题2.32的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!