我正在尝试编写一种尾递归方式将两个已排序的列表合并为一个已排序的列表。
这是我的尝试。首先,我有非尾递归的方法。
merge2 :: Ord a => [a] -> [a] -> [a]
merge2 l1 [] = l1
merge2 [] l2 = l2
merge2 (x:xs) (y:ys) | x > y = y : merge2 (x:xs) ys
| x < y = x : merge2 xs (y:ys)
| otherwise = x : merge2 (x:xs) ys
mergeTail :: Ord a => [a] -> [a] -> [a]
mergeTail accum [] = accum
mergeTail accum (x:xs) = mergeTail (x:accum) xs
当我输入像 merge2Tail [1,2] [2,3,4] 这样的内容时,我期望得到 [1,2,2,3,4] 作为输出结果,但实际上我得到了一些随机的顺序。我不确定在保持尾递归的情况下如何实现检查顺序的情况。
l1
、l2
和累加器。 - melpomene