首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >F#找到Powerset

F#找到Powerset
EN

Stack Overflow用户
提问于 2013-05-29 22:50:17
回答 1查看 1.2K关注 0票数 1

我想找到Powerset

powerset 1; 2;3 == [[];3;2;2;3;1;1;3;1;2;1;2;3]

代码语言:javascript
复制
let rec powerset = function
    | [] -> []
    | x::xs -> List.map (fun ys -> xs) xs::powerset (xs)

我的代码出了问题,这就是我现在的输出。

int list = [[2;3;2;3];[3];[]]

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-30 01:31:37

其他人已经指出了使用序列表达式并懒洋洋地枚举集合的链接。这就是我解决问题的方法(请注意,在序列理解中使用for没有什么不纯或不实用的--这只是生成结果序列的一种方法):

代码语言:javascript
复制
let rec powerset s = seq {
    match s with
    | [] -> yield []
    | h::t -> for x in powerset t do yield! [x; h::x] }

尽管如此,这可以很容易地转换为返回列表并使用高阶函数的代码:

代码语言:javascript
复制
let rec powerset = 
  function
  | [] -> [[]]
  | x::xs -> List.collect (fun subset -> [subset; x::subset]) (powerset xs)

空集的电源集是一个具有单元素[]的集合(请注意,这在您的代码段中是错误的)。要生成x::xs的powerset,我们首先生成xs的powerset,然后为生成的powerset的每个元素返回两组--一个是子集,另一个是添加了x元素的子集。(这是使用List.collect完成的,这类似于调用List.map,然后是List.concat。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16825208

复制
相关文章

相似问题

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