交换F#列表中的每对项目

时间:2011-09-18 22:27:25

标签: f# functional-programming sequences

我很肯定有一种更好的方法来交换列表中的项目([1; 2; 3; 4] - > [2; 1; 4; 3]),因为我也在这样做很多人都喜欢我,但我不确定如何做到最好。

let swapItems lst =
    let f acc item =
        match acc with
        | [] -> [item]
        | hd :: next :: tl when tl <> [] -> [next] @ tl @ [item;hd]
        | _ -> item :: acc
    List.fold f [] lst

我该如何改进?这仅适用于长度均匀的列表。

3 个答案:

答案 0 :(得分:3)

最简单的解决方案:

let rec swapItems = function
  | a::b::xs -> b::a::swapItems xs
  | xs -> xs

我喜欢将类似列表的变量的名称设为“复数”,例如xs代替x

请注意,这不是尾递归,因此如果给它一个很长的列表,它会堆栈溢出。

答案 1 :(得分:2)

这个怎么样:

let rec swapItems = function
    | []
    | _::[] as l -> l
    | a::b::t ->
        b::a::(swapItems t)

答案 2 :(得分:1)

使用高阶函数,可以这样做:

let swapItems l =
    l |> List.toSeq |> Seq.pairwise
    |> Seq.mapi (fun i (a,b) -> if i % 2 = 0 then seq [b;a] else Seq.empty)
    |> Seq.concat |> Seq.toList