-3

定义函数 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)但是如果列表多于两个元素,这将不起作用。我不想使用任何面向对象的东西。正确答案是什么?

4

2 回答 2

3

正确的答案是您应该阅读有关列表的递归

F# 列表是使用空列表[]和 cons(::)构造函数逐步构建的。例如, [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函数也适用于整数。

于 2012-11-20T13:55:17.023 回答
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') 进行比较。将新的最高值和列表的其余部分传递给循环函数,直到输入列表为空。然后只需返回“嗨”。

于 2012-11-20T13:50:21.577 回答