我正在尝试编写合并排序代码。它的打印虽然没有排序。我能做错什么?
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])
答案 0 :(得分:4)
您使用了错误的列表语法。
当您说[1,2,6,5]
时,您并未列出四个元素的列表,而是列出一个一个元素,并且该元素是四个数字的元组。
在F#中,列表元素由新行或分号分隔。
这应该可以正常工作:
printfn "%A" (msortPm[1;2;6;5])
此外,我想指出List.length
完整传递列表(因为F#列表是不可变的单链表),因此会减慢算法速度。最好在空列表和一个元素列表上进行模式匹配:
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)
(另请注意in
之后let
在F#中是可选的