【问题标题】:Sorted Sublist within a F# list of integersF# 整数列表中的排序子列表
【发布时间】:2021-03-24 01:12:49
【问题描述】:

我正在尝试获取一个子列表,其中包含 F# 中从左到右的最大元素,然后是第二大元素。例如,如果我有list1 = [2;5;3;4] ,我应该能够得到[5;4] list1 = [2;1;3;4] 将是 [4] 等等。我真的找不到聪明的方法来做到这一点。我得到以下几行:

let rec top<'a when 'a: comparison> (xs: List<'a>): List<'a> =
     match xs with
        | [] -> invalidArg "xs" "Empty list"
        | [x] -> x::xs
        | x1::x2::xs' -> top((max x1 x2)::xs')

这给了我 [5;5] 而不是 [5;4]

非常感谢您的帮助。谢谢

【问题讨论】:

  • 算法应该如何决定何时停止?比如,在第一个例子中,为什么结果是[5; 4] 而不是[5; 4; 3; 2]?还是您总是只需要两个元素而不再需要?但在这种情况下,为什么第二个示例返回 [4] 而不是 [4; 3]
  • 因为 4 是最后一个也是最大的元素。这个想法是获得最大的,然后最终获得第二大,如果它在第一个之后,而不是之前。算法在到达列表的最后一个元素时停止。就像获取最大的子列表并对其进行降序排序。我不打算将[2;1;3;4] 分类为[4;3;2;1]。我打算得到 4,然后看看右边是否还有小于 4 的东西。因此,如果最大的元素是最后一个元素,它应该返回它 [4] 例如。
  • 您在评论中的附加解释应编辑到问题中。无需阅读其他 cmets 即可完全理解问题。请记住,SO 上的 Q 和 A 是为了以后出现的所有人的利益,而不仅仅是 OP。

标签: list recursion f# sublist


【解决方案1】:

您可以使用辅助递归函数来做到这一点。

let top list =
    let rec loop n = function
        | [] -> [n]
        | [x] -> if n < x then [x] else  [n; x]
        | x :: xs -> loop (max n x) xs
    match list with
    | [] -> invalidArg "list" "Empty list" 
    | x :: xs -> loop x xs

或使用 list.fold

let top (list: int list): int list =
    List.fold (fun s x -> if s.Head < x then [x] else [s.Head; x])
              [list.Head] 
              list.Tail

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多