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