【发布时间】:2017-12-01 17:57:31
【问题描述】:
我正在尝试解决这个问题: 定义一个递归函数 msort :: Ord a => [a] -> [a] 实现- ments 归并排序,可以通过以下两条规则指定: 长度为 1 的列表已经排序; 其他列表可以通过将两半排序并合并 结果列表。
但是我很难理解归并排序的代码是如何工作的。
这是我的代码::
merge :: Ord a => [a] -> [a] -> [a]
merge [] [] = []
merge (x:xs) (y:ys) | y > x = (x:xs) ++ (y:ys)
|otherwise = (y:ys) ++ (x:xs)
msort :: Ord a => [a] -> [a]
--base case , if length less than or equal 1 , then list is already sorted
msort [] = [] -- how to implement base case?
msort (x:xs) = merge (take (length(x:xs) `div` 2 ) (x:xs)) (drop (length(x:xs) `div` 2 ) (x:xs))
【问题讨论】:
-
您有问题吗?
-
您可以在长度与
msort [x] = ..或msort (x:[]) = ..完全相同的列表上进行模式匹配。或者,您可以在(x:xs)案例之后添加一个包罗万象的案例,例如msort x = x -
@user2407038 但是,在
(x:xs)之后添加一个包罗万象的大小写是行不通的,因为它已经捕获了所有长度 >= 1 的列表,包括[x]。 -
@chi 实际上,递归的情况必须改为
(x:y:xs)。