【问题标题】:finding subsets of length N of a list in scheme在方案中查找列表长度为 N 的子集
【发布时间】:2013-12-04 02:13:03
【问题描述】:

我写了一个函数,它已经找到了一个列表的所有子集并且它可以工作。我正在尝试编写第二个函数,在其中获取 N 长度的所有子集,但效果不佳。

这是我的代码:

(define (subset_length_n n lst)
  (cond 
    [(empty? lst) empty]
    [else (foldr (lambda (x y) (if (equal? (length y) n) (cons y x) x)) empty (powerset lst))]

))

where (powerset lst) 给出所有子集的列表。 我误解了foldr的目的吗? 我在想该程序将遍历子集列表的每个元素,将长度与 n 进行比较,如果相同则将其放到空列表中,如果不是则忽略它。

但是 (subset_length_n 2 (list 1 2 3)) 在我想要的时候给了我 (list (list 1 2) 1 2 3) (list (list 1 2) (list 1 3) (list 2 3))

提前致谢

【问题讨论】:

    标签: scheme subset fold


    【解决方案1】:

    使用foldr 时,您不必测试输入列表是否为空,foldr 会为您处理。这似乎是一份更适合filter的工作:

    (define (subset_length_n n lst)
      (filter (lambda (e) (= (length e) n))
           (powerset lst)))
    

    如果必须,您可以为此使用foldr,但这是一个相当人为的解决方案。你已经非常接近正确了!在您的代码中,只需更改lambda 的参数,而不是(x y)(y x)。看看一个漂亮的缩进和适当的参数名称如何有助于编写正确的解决方案:

    (define (subset_length_n n lst)
      (foldr (lambda (e acc)
               (if (= (length e) n)
                   (cons e acc)
                   acc))
             empty
             (powerset lst)))
    

    无论如何,它按预期工作:

    (subset_length_n 4 '(1 2 3 4 5))
    => '((1 2 3 4) (1 2 3 5) (1 2 4 5) (1 3 4 5) (2 3 4 5))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-02
      • 2021-03-13
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      相关资源
      最近更新 更多