我正在尝试编写一个找到最大值的F#函数。我是F#的新手,对于如何使用正确的类型和递归来实现它感到很困惑。
任何帮助都会非常感激,并解释它是如何工作的,我真的需要了解它是如何工作的,所以我可以尝试创建其他F#函数。谢谢!
答案 0 :(得分:3)
创建递归函数时,请开始考虑角点情况。你的帮助函数采用一个列表和“目前为止的最大值”。拐角案例:如果您的清单是空的怎么办?如果您只有1个元素列表,或者专注于第一个元素,该怎么办?这直接转化为match
声明:
let rec helper (l, m) =
match l, m with
| [], m -> m
| (l1 :: rest), m ->
let max1 = if l1 > m then l1 else m
helper(rest, max1)
我会打开包装器findMax
,但显然你可以用同样的想法解决这个问题:如果你得到一个空列表怎么办? (尖叫!)如果你得到一个包含元素的列表怎么办(第一个元素是你到目前为止的最大值,将列表的其余部分输入你的helper
)
当然,你可以把它全部放在一个功能中。我选择了这个相当迂回的helper
,因为你的模板代码就是这样形成的。
答案 1 :(得分:3)
首先要做的是以递归方式和/或数学方式开始思考。在大多数一般模糊的术语中,它应该看起来像“我的函数的结果是...... ” - 然后尝试实际将结果放入文字中。
应用你的特定问题,我会这样说:
findMax
的结果就是那个元素。findMax
的结果是列表头部的最大值和尾部的最大元素。这种想法几乎可以逐字逐句地转化为F#:
let rec findMax list =
match list with
| [x] -> x
| head::tail -> max head (findMax tail)
其中:
let max a b = if a > b then a else b
但请注意,此函数不完整:它没有指定给定空列表时的结果。我将此作为练习留给读者。