F#元素列表

时间:2017-01-31 16:28:00

标签: f#

我正在尝试编写一个找到最大值的F#函数。我是F#的新手,对于如何使用正确的类型和递归来实现它感到很困惑。

任何帮助都会非常感激,并解释它是如何工作的,我真的需要了解它是如何工作的,所以我可以尝试创建其他F#函数。谢谢!

2 个答案:

答案 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

但请注意,此函数不完整:它没有指定给定空列表时的结果。我将此作为练习留给读者。