微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我正在尝试理解这段 Scheme 代码,有人可以给我解释一下吗?

如何解决我正在尝试理解这段 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 举报,一经查实,本站将立刻删除。