【问题标题】:How to use powerset function in finding the sum of subsets如何使用 powerset 函数查找子集的总和
【发布时间】:2015-04-18 20:18:03
【问题描述】:

对于这个问题,我有一个称为 powerset 函数的函数

(define (powerset set)
  (if (null? set)
      '(())
      (let ((rest (powerset (cdr set))))
        (append (map (lambda (element) (cons (car set) element))
                     rest)
                rest))))

如果从 powerset 函数生成的子集的总和等于作为参数传入的总和,我想使用该函数返回 true。我想我的想法是对的,但我不确定如何实施。我知道这个函数生成的列表应该一次传递给另一个函数 1 子集。在该函数中,我想将子集中的这些值加在一起,看看它们是否等于总和。到目前为止得到了这个,但我知道它错了。

(define (group list sum)
 (cond((null? list) #f)
      ((equal? (apply + (powerset list)) sum)#t)
      (else (group((powerset list))sum)) ))

所以我需要一个函数,它调用 powerset 一次并将列表传递给另一个函数,该函数将子集的总和与作为总和传递的值进行比较。

例如,如果我打电话:

(group '(1 2 4 5) 9)

我希望它返回 #t,因为子集 (4, 5) 的总和等于 9。如果您知道如何使用 powerset 并且可以展示解决此问题的示例,我们将不胜感激。

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

    一种方法是在您的子集列表上映射一个 sum 函数,这将为您提供一个列表,其元素对应于每个子集的总和。然后您可以检查此总和列表中的任何元素是否等于提供的目标总和。

    这样做的一种方法是:首先我们需要一个函数来对列表求和。我们可以为此使用折叠:

    (define (sum set)
        (fold-right + 0 set))
    

    现在,我们定义一个函数,如果给定的元素包含在提供的列表中,则返回 true,否则返回 false:

    (define (contains n set)
        (if (null? set)
            #f
            (if (= (car set) n)
                #t
                (contains n (cdr set)))))
    

    (我不是 Scheme 方面的专家,所以我不确定这是否是内置的)。

    有了这个定义,我们就可以编写你想要的函数了:

    (define (group set n)
        (contains n (map sum (powerset set))))
    

    您可以测试您的示例 (group '(1 2 4 5) 9) 是否为我们提供了 #t

    【讨论】:

    • 嘿,非常感谢您的输入,我尝试在 Racket 博士的 R5RS 语言中尝试运行它,虽然我遇到了错误,但它告诉我 fold-right: undefined;无法引用未定义的标识符
    • 如果您有任何想法或可以提供帮助,我将不胜感激
    • 嘿,实际上我只是将函数更改为一种不同的方式来实现列表中的总和,非常感谢它的工作原理:)
    • 如果您觉得答案有帮助,您应该点赞或接受。
    猜你喜欢
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多