【发布时间】:2019-11-05 00:06:11
【问题描述】:
我正在尝试编写一种尾递归方式来将两个排序列表合并为一个排序列表。
这就是我所拥有的。首先我有非尾递归方式
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] 作为输出,但我以随机顺序得到它。我不确定在哪里或如何实现一个检查顺序的案例,同时保持它的尾递归。
【问题讨论】:
-
你知道如何以非尾递归的方式来做吗?
-
是的,我应该编辑并包含它吗?
-
这听起来相当低效。为什么你希望它是尾递归的?
-
@Larry.Fish 那么你需要三个参数,
l1和l2以及累加器。 -
是的,基于累加器的解决方案使用带有附加参数的辅助函数。最初,它可以是一个空列表。递归时,将您希望“输出”到累加器的元素前置。最后,累加器将以相反的顺序包含想要的列表。