我正在尝试写一个函数,它接受一个集合作为参数,并返回它的幂集合,也是一个集合的集合。
示例用法:
(power-set (set 1 2))
; is supposed to output
=> (set (set) (set 1) (set 2) (set 1 2))到目前为止,我得到的是:
(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”有什么问题?
发布于 2020-04-16 12:55:55
在发布的代码中,有两件事会让您感到痛苦:两个过程调用中的参数顺序,以及一个过程调用的返回类型。
set-add过程接受set作为其第一个参数,因此这里的参数需要互换:
(set-add subset (set-first st))类似地,set-map将set作为其第一个参数,并将过程作为其第二个参数:
(set-map ps
(lambda (subset) (set-add subset (set-first st))))现在,有点违反直觉的是,set-map返回的是list,而不是set;但是,set-union正在寻找set。要为set-union提供它想要的东西,可以使用list->set从list构造set
(list->set (set-map ps
(lambda (subset) (set-add subset (set-first st)))))综合来看:
(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)))))))))下面是几个示例运行:
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))https://stackoverflow.com/questions/61242191
复制相似问题