Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List F#9将名称分成2、3和4个不相连的组_List_F# - Fatal编程技术网

List F#9将名称分成2、3和4个不相连的组

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)] | _, [] -> [] |

我对F#非常陌生,一直在研究和运行我在网上发现的简单问题的示例。我偶然发现了一个似乎不起作用的代码,我希望有人能解释代码中发生了什么以及为什么。函数应该返回列表中的1260个不同选项,但它返回的是空列表[]

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#List
Seq.collect
将三个集合展平为一个,最后只需使用Seq.toList来显示结果。该库还具有排列和变体,以及生成或不生成重复的选项(似乎这是默认设置)