F# 整数列表中的排序子列表

Sorted Sublist within a F# list of integers

我正在尝试获取一个子列表,该子列表包含 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]

非常感谢您的帮助。谢谢

您可以使用辅助递归函数来完成。

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