比较列表中的值

拉佐尔

试图概念化我将如何比较列表中的几个值以找到最大值,而不使用可变变量。

例如在命令式语言中,我可以简单地存储一个 max 变量,每次迭代在列表中找到更大的值时都会更新该变量。像这样:

max = 0;
for i in list
  if i > max
    max = i

现在,在函数式编程中,如果我有一个列表,例如 [1; 2; 3] 我将如何解决使用 max 变量的问题?

距离

简单的答案是使用let maxValue = List.max theList.

如果您想在不使用显式可变变量的情况下“推出自己的”,显而易见的方法是使用递归函数。就个人而言,我会这样定义它:

let listMax theList = 
    let rec maxHelper remainingList maxSoFar = 
        match remainingList with
        | [] -> maxSoFar
        | h :: t -> 
                      if h > maxSoFar then
                          maxHelper t h
                      else
                          maxHelper t maxSoFar

    maxHelper theList (List.head theList)

请注意,所提供的这个实现会抛出一个带有空输入列表的异常(另外,我还没有实际测试过这个,所以那里可能会有一个小错误)。我这样做的原因是它使用尾递归,这应该意味着它与可变解决方案大致一样有效,但将公开函数签名的复杂性保持在最低限度。

或者,这也可以通过 List.fold 调用轻松完成。例如

List.fold (fun (nextElem, maxSoFar) -> 
    if nextElem > maxSoFar then nextElem else maxSoFar) (List.head theList) theList

关于没有测试它的同样的附带条件也适用于此。

在所呈现的两种情况下,通过使用另一个参数,即执行所述操作的函数,这可以更通用地应用于任何返回布尔值的二元运算。例如

List.fold (fun (nextElem, maxSoFar) -> 
        if comparatorFunction nextElem maxSoFar then nextElem else maxSoFar)
        (List.head theList) theList

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章