首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >球拍-一个函数,接受一个集合作为输入,并输出它的功率集合

球拍-一个函数,接受一个集合作为输入,并输出它的功率集合
EN

Stack Overflow用户
提问于 2020-04-16 11:26:49
回答 1查看 576关注 0票数 1

我正在尝试写一个函数,它接受一个集合作为参数,并返回它的幂集合,也是一个集合的集合。

示例用法:

代码语言:javascript
复制
(power-set (set 1 2)) 
; is supposed to output
=> (set (set) (set 1) (set 2) (set 1 2))

到目前为止,我得到的是:

代码语言:javascript
复制
(define (power-set st)
  (if (set-empty? st) (set (set))
    (let ((ps (power-set (set-rest st))))
      (set-union ps 
                 (set-map (lambda (subset) 
                              (set-add (set-first st) subset)) 
                          ps)))))

但是,DrRacket在包含set-map的行上抛出了一个错误:

我能对我的函数做些什么来让它正确执行吗?似乎"set-map“或"lambda”有什么问题?

EN

回答 1

Stack Overflow用户

发布于 2020-04-16 12:55:55

在发布的代码中,有两件事会让您感到痛苦:两个过程调用中的参数顺序,以及一个过程调用的返回类型。

set-add过程接受set作为其第一个参数,因此这里的参数需要互换:

代码语言:javascript
复制
(set-add subset (set-first st))

类似地,set-mapset作为其第一个参数,并将过程作为其第二个参数:

代码语言:javascript
复制
(set-map ps
         (lambda (subset) (set-add subset (set-first st))))

现在,有点违反直觉的是,set-map返回的是list,而不是set;但是,set-union正在寻找set。要为set-union提供它想要的东西,可以使用list->setlist构造set

代码语言:javascript
复制
(list->set (set-map ps
                    (lambda (subset) (set-add subset (set-first st)))))

综合来看:

代码语言:javascript
复制
(define (power-set st)
  (if (set-empty? st) (set (set))
      (let ((ps (power-set (set-rest st))))
        (set-union ps
                   (list->set
                    (set-map
                     ps
                     (lambda (subset) (set-add subset (set-first st)))))))))

下面是几个示例运行:

代码语言:javascript
复制
scratch.rkt> (power-set (set 1 2))
(set (set 1) (set) (set 1 2) (set 2))
scratch.rkt> (power-set (set 1 2 3))
(set (set 1) (set 1 3) (set 1 3 2) (set 3 2) (set) (set 1 2) (set 2) (set 3))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61242191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档