【发布时间】: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。