使用尾递归的插入排序&第一顺序功能

时间:2017-05-24 15:13:43

标签: haskell functional-programming tail-recursion insertion-sort

我想在Haskell中设计一个算法,使用尾递归一阶编程进行插入排序

我已经提出了这个解决方案

isort :: Ord a => [a] -> [a]
isort [] = []
isort [x] = [x]
isort ( x:xs ) = insert ( isort xs )
    where insert [] = [x]
          insert ( y:ys )
            | x < y = x : y : ys
            | otherwise = y : insert ys

但我不确定它是否使用一阶和尾递归。

有人可以使用

提出替代解决方案
  • 尾递归
  • 一阶编程

谢谢,

1 个答案:

答案 0 :(得分:1)

这是简单版本,不使用尾递归也不使用HOF

sort :: Ord a => [a] -> [a]
sort   []   = []
sort  [x]   = [x]
sort (x:xs) = insert x (sort xs)

insert :: Ord a => a -> [a] -> [a]
insert x [] = [x]
insert x (y:ys) | x < y     = x:y:ys
                | otherwise = y:insert x ys

你可以添加一个累加器,它允许我们使用尾递归重写排序:

sort' :: Ord a => [a] -> [a]
sort' xs = sortAcc xs []

sortAcc :: Ord a => [a] -> [a] -> [a]
sortAcc   []   acc = acc
sortAcc (x:xs) acc = sortAcc xs (insert x acc)

insert的定义非常好;但只是为了这个目的 使用高阶函数,我们可以定义它:

insert' :: Ord a => a -> [a] -> [a]
insert' x xs = menores ++ x:mayores
  where (menores,mayores) = span (<x) xs

其中(<x)部分是传递给Ord a => a -> Bool的{​​{1}}类型的函数。