【问题标题】:F# - splitting list into tuple of odd-even lists (by element, not position)F# - 将列表拆分为奇偶列表的元组(按元素,而不是位置)
【发布时间】:2017-11-06 20:02:07
【问题描述】:

示例: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 指出我的错误:无法到达的案例和不必要地修改赔率

【问题讨论】:

  • 一个忠告,因为这似乎是家庭作业:你应该告诉你的教授你在 Stack Overflow 上寻求帮助,以及你得到了什么帮助。最好的方法是在上交作业时在作业的 cmets 中包含指向此问题的链接 --https://stackoverflow.com/q/44379239/。根据您的教授寻求帮助的政策,您可能需要也可能不需要这样做,但最好完全公开你在做作业时获得的任何帮助。
  • 感谢您编辑问题以帮助将来可能找到它的其他人。但是,在 Stack Overflow 上,无需在问题标题中加上“(已解决)”:您通过给它一个绿色复选标记来接受答案这一事实足以传达这一事实,事实上人们更喜欢 not 将“(已解决)”放入问题标题中。不过,您愿意这样做是值得赞赏的。 :-)

标签: list recursion split f# partition


【解决方案1】:

可以使用内置的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.partition 函数来解决这个问题。我将研究该功能的工作原理并尝试解决问题。非常感谢!
  • @SergioRosales 刚刚也添加了一个递归实现。
  • @SergioRosales 没问题。仅供参考,您在问题 几乎 中提供的实现有效。如果您删除| xs -&gt; xs, [] 模式匹配案例并将if (xh % 2) = 0 then xh::odds, xh::evens 替换为if (xh % 2) = 0 then odds, xh::evens,您就有了另一个工作实现。该实现不是尾递归,因为进行递归调用不是函数所做的最后一件事。这就是为什么我想向你展示一些不同的东西。
猜你喜欢
  • 2017-01-26
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
相关资源
最近更新 更多