【问题标题】:Subsets of List Using Recursion使用递归的列表子集
【发布时间】:2013-10-25 07:45:09
【问题描述】:

我需要编写一个函数来生成给定列表的所有可能子集。我相信我应该使用 map,但我正在努力想出正确的迭代语法。我必须在任何地方插入 lambda 语句吗?

(list 1 2 3) 的所有可能子集应为:

(list (list) 
      (list 1) (list 2) (list 3) 
      (list 1 2) (list 2 3) (list 1 3) 
      (list 1 2 3)))

【问题讨论】:

标签: list recursion scheme racket


【解决方案1】:

考虑通过包含或不包含每个项目来生成一个幂集。基本情况是如果您没有项目,在这种情况下,幂集是具有空集的集。伪代码是:

Powerset([]) = [[]]
Powerset(first:rest) = 
    let subPowersets = Powerset(rest) in
        [subPowerset for subPowerset in subPowersets] ++
        [first:subPowerset for subPowerset in subPowersets]

【讨论】:

  • 谢谢。我现在知道如何设置函数了。
【解决方案2】:

你也可以试试:

(define power-set 
 (lambda (set)
   (if (empty? set) '()
        (remove-duplicates (append* (power-set (car set))
                                          (map (lambda (x) (cons (car A) x)) (power-set (cdr A))))))))

虽然我将此代码与其他函数一起使用,例如 (set-union) 而不是 (remove-duplicates (append*...)),但是我使用另一个函数根据它们的基数对它们进行了排序。

您可以通过阅读其数学定义来构建这些简单的程序。 您可以通过阅读文档来改进它们(一些数学定义会导致“错误”递归,您可以尝试使用tail-recursion

【讨论】:

    猜你喜欢
    • 2020-09-17
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2019-04-22
    • 2019-06-27
    • 2020-01-21
    • 1970-01-01
    • 2020-04-06
    相关资源
    最近更新 更多