OCaml:交换列表中的元素

时间:2012-03-24 11:30:37

标签: list ocaml

我想知道如何编写一个将给定列表划分为给定点的子列表的函数,交换这些子列表并返回结果列表。

例如:

swap([1;3;5;6],2) => [5;6;1;3]

我想我开发的代码是正确的吗?

let rec swap (l,n) =
let rec loop t (count,laux)  =
            match t with
            |  h::t when count < n -> loop t (count+1, h::laux)
            |  h::t ->   h::t@  List.rev laux
            | []->[]
in
    loop l (0,[]) 

;;

1 个答案:

答案 0 :(得分:3)

你快到了。问题是当l的长度大于或等于n时,您的函数处理的情况不正确。

模式[]并不意味着输入列表为空;这意味着我们走到了列表的最后。那时你应该做的是以相反的顺序返回累加器acc

我稍微重新排列模式,因此基本情况首先出现:

let rec swap (l, n) =
    let rec loop xs count acc =
            match xs with
            | _ when count = n -> xs @ List.rev acc
            | [] -> List.rev acc
            | h::t -> loop t (count+1) (h::acc)
     in loop l 0 []