问题描述
我在互联网上找到了这个 Scheme 代码,它输出给定列表的所有子集,有人可以解释它是如何工作的吗?
(define (subsets s) (if (null? s)
(list ())
(let ((rest (subsets (cdr s))))(append rest (map (lambda (x) (cons (car s) x)) rest)))))
(subsets '(a b c))
解决方法
您确实需要对其进行格式化:
(define (subsets s)
(if (null? s)
(list ())
(let ((rest (subsets (cdr s))))
(append rest
(map (lambda (x)
(cons (car s) x))
rest)))))
它所做的是为参数 (())
返回 '()
对于单元素参数,例如。 '(b)
if 将 rest
绑定到除第一个元素之外的每个元素的子集.. 没有元素所以 rest
是 (())
然后它返回一个由所有元素组成的列表在 rest
以及 rest
的每个列表元素中添加了 b
。因此(() (b))
。
对于两个元素的参数,例如。 '(a b)
它将 rest
绑定到除第一个元素之外的每个元素的子集。哪个是 (b)
所以我们从上面知道它是 (() (b))
并且我们知道它将使用那些以及添加到开头的 a
的每个元素:(() (b) (a) (a b))
>
我可以继续,但我猜你看懂了吗?