list - F# - 将列表拆分为奇偶列表元组(按元素,而不是位置)

标签 list recursion split f# partition

示例:split [1;3;2;4;7;9];;
输出:([1;3;7;9], [2;4])

我是 F# 的新手,我搞不懂。
无法使用 partition 内置函数。

这是我目前所拥有的:

let rec split xs = 
    match xs with
    | [] -> [], []
    | xs -> xs, []
    | xh::xt -> let odds, evens = split xt
                if (xh % 2) = 0 then xh::odds, xh::evens
                else xh::odds, evens  

固定代码:

let rec split xs = 
    match xs with
    | [] -> [], []
    | xh::xt -> let odds, evens = split xt
                if (xh % 2) = 0 then odds, xh::evens
                else xh::odds, evens

*感谢@TheInnerLight 指出我的错误:无法到达的案例和不必要地修改赔率

最佳答案

可以使用内置的List.partition函数

let splitOddEven xs =
    xs |> List.partition (fun x -> x % 2 <> 0)
splitOddEven [1;3;2;4;7;9];;
val it : int list * int list = ([1; 3; 7; 9], [2; 4])

如果你想要一个递归实现,我可能会选择这样的尾递归实现:

let splitOddEven xs =
    let rec splitOddEvenRec oddAcc evenAcc xs = 
        match xs with
        | [] -> oddAcc, evenAcc
        | xh::xt -> 
            if (xh % 2) = 0 then splitOddEvenRec oddAcc (xh :: evenAcc) xt
            else splitOddEvenRec (xh :: oddAcc) evenAcc xt
    splitOddEvenRec [] [] xs

splitOddEven  [1;3;2;4;7;9]

请注意,这会以相反的顺序为您提供两个结果列表,因此您可能希望自己反转它们。

关于list - F# - 将列表拆分为奇偶列表元组(按元素,而不是位置),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44379239/

相关文章:

Python 解析列表

haskell - 为什么 foldl 尽管是尾递归的,但似乎是有害的?

c - C 中使用 pthread 的递归函数

list - 在haskell的新函数中使用过滤列表

r - 在 R 中拆分的快速替代方案

pdf - 如何将 PDF 拆分为多个文档

javascript - 如何在不递归的情况下将列表转换为二叉树

javascript - React 不渲染 Li 元素

list - 反转列表时出现意外结果

java - 如何在不使用数组的情况下拆分字符串?