球拍组合功能

Racket combinations function

我需要一些关于以下用于计算列表组合的代码如何工作的解释。

(define combs L k)
  (cond ((= 0 k)
         '(()))
        ((null? L)
         '())
        (else
         (append (map (λ (x) (cons (car L) x)) 
                          (combs (cdr L) (- k 1)))
                 (combs (cdr L) k))))))
  • 组合列表中的零个元素得到 '(())
  • 组合空列表中的任何内容得到 '().
  • 对于最后一个案例,结果分为两部分:
    1. 包含(car L)
    2. 的组合
    3. 没有的组合。

第 2 项的答案是仅组合 (cdr L) 个中的 k 个元素。
对于第 1 项,从 (cdr L) 中形成 k - 1 个元素的组合,然后将 (car L) 添加到每个元素。