Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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
F#中的合并排序代码不排序_F# - Fatal编程技术网

F#中的合并排序代码不排序

F#中的合并排序代码不排序,f#,F#,我正试图写一个合并排序代码。它是打印的,但不是排序。我可能做错了什么 let rec mergePm xs ys = match (xs, ys) with | [], _ -> ys | _,[] -> xs | x::xs, y::ys -> if x < y then x :: mergePm xs (y::ys) else y :: mergePm (x::xs) ys let rec msortP

我正试图写一个合并排序代码。它是打印的,但不是排序。我可能做错了什么

let rec mergePm xs ys =
    match (xs, ys) with
    | [], _ -> ys
    | _,[] -> xs
    | x::xs, y::ys ->
        if x < y then x :: mergePm xs (y::ys)
        else y :: mergePm (x::xs) ys

let rec msortPm xs =
    let sz = List.length xs
    if sz < 2 then xs
    else
        let n = sz / 2
        let ys = xs. [0..n-1]
        let zs = xs.[n..sz-1]
            in mergePm (msortPm ys) (msortPm zs)

printfn "%A" (msortPm[1,2,6,5])
让rec合并pm xs ys=
将(xs,ys)与
|[],[uuys->
|_u,[]->xs
|x::xs,y::ys->
如果x
您使用了错误的列表语法

当你说
[1,2,6,5]
时,你并没有列出四个元素,而是列出一个元素,这个元素是四个数字的元组

在F#中,列表元素由新行或分号分隔

这应该很好:

printfn "%A" (msortPm[1;2;6;5])

另外,我想指出,
List.length
会对列表进行完整遍历(因为F#List是不可变的单链表),因此会降低算法的速度。最好在空列表和一个元素的列表上进行模式匹配:

let rec msortPm xs = match xs with
    | [] | [_] -> xs
    | _ ->
        let n = sz / 2
        let ys = xs. [0..n-1]
        let zs = xs.[n..sz-1]
        mergePm (msortPm ys) (msortPm zs)

(还要注意
中的
之后是如何在F#中可选的)

哦,我明白了,非常感谢:)。我对编程很陌生