我很肯定有一种更好的方法来交换列表中的项目([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
我该如何改进?这仅适用于长度均匀的列表。
答案 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