如何解决我正在尝试理解这段 Scheme 代码,有人可以给我解释一下吗?
我在互联网上找到了这个 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))
>
我可以继续,但我猜你看懂了吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。