How can I implement a tail-recursive list append?

后端 未结 3 764
无人及你
无人及你 2020-12-06 02:52

A simple append function like this (in F#):

let rec app s t =
   match s with
      | [] -> t
      | (x::ss) -> x :: (app ss t)

will

3条回答
  •  失恋的感觉
    2020-12-06 03:07

    Traditional (not tail-recursive)

    let rec append a b =
        match a, b with
        | [], ys -> ys
        | x::xs, ys -> x::append xs ys
    

    With an accumulator (tail-recursive)

    let append2 a b =
        let rec loop acc = function
            | [] -> acc
            | x::xs -> loop (x::acc) xs
        loop b (List.rev a)
    

    With continuations (tail-recursive)

    let append3 a b =
        let rec append = function
            | cont, [], ys -> cont ys
            | cont, x::xs, ys -> append ((fun acc -> cont (x::acc)), xs, ys)
        append(id, a, b)
    

    Its pretty straight-forward to convert any non-tail recursive function to recursive with continuations, but I personally prefer accumulators for straight-forward readability.

提交回复
热议问题