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#中可选的)哦,我明白了,非常感谢:)。我对编程很陌生