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