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]];[]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
其他人已经指出了一个链接,该链接使用序列表达式并惰性地枚举集合。这就是我解决问题的方法(请注意,在序列理解中使用
并没有什么不纯或不实用的地方,它只是生成结果序列的一种方法):
也就是说,这可以很容易地转换为返回列表并使用高阶函数的代码:
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)