我正在尝试理解这段 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))>

我可以继续,但我猜你看懂了吗?