OCaml:交换列表中的元素

3
我想知道如何编写一个函数,将给定列表分成子列表并在给定点交换这些子列表,最后返回一个结果列表。
例如:
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个回答

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 []

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接