Recursion F#找到动力装置

Recursion F#找到动力装置,recursion,f#,Recursion,F#,我想找到电源集 电源集[1;2;3]=[[];[3];[2];[2;3];[1];[1;3];[1;2];[1; 2、 3]] 我的代码有问题,这就是我现在输出的样子 val it:int list=[[2;3];[2;3]];[[3]];[] 其他人已经指出了一个链接,该链接使用序列表达式并惰性地枚举集合。这就是我解决问题的方法(请注意,在序列理解中使用并没有什么不纯或不实用的地方,它只是生成结果序列的一种方法): 也就是说,这可以很容易地转换为返回列表并使用高阶函数的代码: let rec

我想找到电源集

电源集[1;2;3]=[[];[3];[2];[2;3];[1];[1;3];[1;2];[1; 2、 3]]

我的代码有问题,这就是我现在输出的样子

val it:int list=[[2;3];[2;3]];[[3]];[]


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

也就是说,这可以很容易地转换为返回列表并使用高阶函数的代码:

let rec powerset = 
  function
  | [] -> [[]]
  | x::xs -> List.collect (fun subset -> [subset; x::subset]) (powerset xs)

空集合的幂集合是具有单个元素的集合
[]
(请注意,这在代码段中是错误的)。要生成
x::xs
的功率集,我们首先生成
xs
的功率集,然后为生成的功率集的每个元素返回两个集-一个是子集,另一个是添加了
x
元素的子集。(这是通过使用
List.collect
来完成的,就像调用
List.map
然后调用
List.concat

如果您查看您提供的链接,您会发现问题是针对一系列集合的。我的问题是关于一个列表的幂集。@MikeJohn您的问题并没有特别询问F#3.0功能,或者从脚本的角度(即,在
*.fsx
文件中编写shell脚本)如何使用F#,这就是我删除标记的原因。你有什么特别的理由认为应该应用它们吗?@MikeJohn你有没有看Gene的链接?据我所知,它完全回答了你的问题。我不想使用递归和for循环。我还发现提供链接的方式是冒犯性的,起初我认为它是指向谷歌的链接,而不是指向我的问题的链接?来自C#,我一直认为它是powerset中的foreach x。如果你来自C#,那么你可以把
seq{..}
看作一个迭代器方法,
yield
对应于
yield return
for
foreach
的意思相同,但在迭代器块中,它只是生成元素-不进行任何变异)您可以扩展我尝试过的| x::xs->List.map(List.concat(fun ss->[ss;x::ss])(powerset xs吗);并在寻找b列表时获得'->b列表。
let rec powerset s = seq {
    match s with
    | [] -> yield []
    | h::t -> for x in powerset t do yield! [x; h::x] }
let rec powerset = 
  function
  | [] -> [[]]
  | x::xs -> List.collect (fun subset -> [subset; x::subset]) (powerset xs)