如何从带有两个参数的函数的列表中获取最大值?

时间:2012-11-20 13:33:47

标签: f#

定义函数max2,它将两个整数作为参数并返回它们中的最大值。

我这样做了:let max2 x y = if x < y then y else x我相信这是正确的

然后定义函数max_list,它通过调用max2返回非空的整数列表中最大的元素。对于空列表,它应该中止并显示错误消息(引发异常)

我这样做了:let list = [3;4] let max_list = if list.IsEmpty then 0 else max2 list.Item(0) list.Item(1)但如果列表超过两个元素,这将不起作用。我不想使用任何面向对象的东西。什么是正确的答案?

2 个答案:

答案 0 :(得分:3)

正确答案是您应该阅读recursion with lists

使用空列表[]和cons (::)构造函数逐步构建F#列表。例如, [3; 4]3::4::[]的语法糖。我们经常在编写递归函数时在列表上使用模式匹配。

这是一个紧密遵循您的要求的递归函数:

let rec max_list xs =
   match xs with
   // The function aborts with an error message on empty lists
   | [] -> invalidArg "xs" "Empty list"
   // Return immediately on a singleton list
   | [x] -> x
   // xs has at least two elements, call max_list 
   // on the bigger element of the first two ones and the rest of the list
   | x1::x2::xs' -> max_list((max2 x1 x2)::xs')

另外,还有一个内置的通用max函数,它也适用于整数。

答案 1 :(得分:1)

一个简单的递归解决方案:

let max2 x y = if x < y then y else x

let max_list list =
  let rec loop hi list = 
     match list with 
     | h::t -> let hi = max2 h hi
               loop hi t
     | []   -> hi
  match list with
  | h::t -> loop h t
  | []   -> invalidArg "list" "Empty list"

在FSI进行测试:

> max_list [3;4;5;1;2;9;0];;
val it : int = 9

对于列表中的每个元素,将其与之前的最高元素('hi')进行比较。将新的最高列表和列表的其余部分传递给循环函数,直到输入列表为空。然后返回'hi'。