List F#9将名称分成2、3和4个不相连的组
我对F#非常陌生,一直在研究和运行我在网上发现的简单问题的示例。我偶然发现了一个似乎不起作用的代码,我希望有人能解释代码中发生了什么以及为什么。函数应该返回列表中的1260个不同选项,但它返回的是空列表[]List F#9将名称分成2、3和4个不相连的组,list,f#,List,F#,我对F#非常陌生,一直在研究和运行我在网上发现的简单问题的示例。我偶然发现了一个似乎不起作用的代码,我希望有人能解释代码中发生了什么以及为什么。函数应该返回列表中的1260个不同选项,但它返回的是空列表[] let rec group ns xs = let rec combination n xs = match n, xs with | 0, xs -> [([], xs)] | _, [] -> [] |
let rec group ns xs =
let rec combination n xs =
match n, xs with
| 0, xs -> [([], xs)]
| _, [] -> []
| n, x::xs ->
let ts = [for ys, zs in combination(n-1) xs do yield (x::ys, zs)]
let ds = [for ys, zs in combination n xs do yield (ys, x::zs)]
ts @ ds
match ns, xs with
| [], _ -> ([])
| n::ns, xs ->
[for g, rs in combination n xs do
for gs in group ns xs do
yield g::gs]
[<EntryPoint>]
let main argv =
let list = ["One"; "Two"; "Three"; "Four"; "Five"; "Six"; "Seven"; "Eight"; "Nine"]
let groupSizes = [2;3;4]
printfn "%A" <| group groupSizes list
let rec group ns xs=
让rec组合nxs=
将n,xs与
|0,xs->[([],xs)]
| _, [] -> []
|n,x::xs->
设ts=[对于组合(n-1)中的ys,zs,xs确实产生(x::ys,zs)]
设ds=[对于ys,zs组合nxs确实产生(ys,x::zs)]
ts@ds
将ns、xs与
| [], _ -> ([])
|n::ns,xs->
[对于g,rs组合n xs do
对于ns xs do组中的gs
产量g::gs]
[]
让主argv=
让列表=[“一”;“二”;“三”;“四”;“五”;“六”;“七”;“八”;“九”]
让groupsize=[2;3;4]
printfn“%A”查看
的第二个,似乎同时使用循环和递归
如果要使用递归,则不需要循环,递归将为您循环,请尝试将最后几行更改为:
| n::ns, xs ->
[for g, rs in combination n xs do
yield g
yield! group ns xs]
这里yield
相当于:
操作,我的意思是您也可以这样编写:
[for g, rs in combination n xs do yield g] :: group ns xs
请注意,rs
未使用,因此您可以编写\uu
:
[for g, _ in combination n xs do yield g] :: group ns xs
最后请注意,您可以使用映射
,使用函数fst
:
List.map fst (combination n xs do yield g) :: group ns xs
Gustavo的答案应该会修正你的递归,但是不清楚你是在练习递归、F#还是组合数学。因此,如果您遇到许多类似的问题,即使是重复检查输出,您也可以使用.NET中的。例如:
#r @"..\packages\Combinatorics.1.0.3.2\lib\net40\Combinatorics.dll"
open Combinatorics.Collections
let list = ResizeArray["One"; "Two"; "Three"; "Four"; "Five"; "Six"; "Seven"; "Eight"; "Nine"]
let groupSizes = [2;3;4]
groupSizes
|> Seq.collect (fun x -> Combinations<string>(list,x))
|> Seq.toList
//|> Seq.length
#r@.\packages\combinations.1.0.3.2\lib\net40\combinations.dll”
开放组合学.集合
let list=ResizeArray[“一”;“二”;“三”;“四”;“五”;“六”;“七”;“八”;“九”]
让groupsize=[2;3;4]
群体规模
|>顺序收集(乐趣x->组合(列表,x))
|>序号:toList
//|>序号长度
我只做了一个更改,正如库所期望的一般集合一样,我使用了ResizeArray
,这只是通常的C#ListSeq.collect
将三个集合展平为一个,最后只需使用Seq.toList来显示结果。该库还具有排列和变体,以及生成或不生成重复的选项(似乎这是默认设置)