初学者到SML / NJ。如何在列表中找到最大值

时间:2013-09-17 19:24:49

标签: functional-programming sml smlnj

  

我们希望在给定的非空整数列表中找到最大值。然后我们必须比较列表中的元素。自数据   值作为序列给出,我们可以从中进行比较   从列表的开头或结尾。以两种方式定义。一个)   比较从头开始b)比较结束(我们怎么样   当数据值在列表中时执行此操作?)没有辅助功能。

我一直在玩递归函数,但似乎无法弄清楚如何比较列表中的两个值。

fun listCompare [] = 0
  | listCompare [x] = x
  | listCompare (x::xs) = listCompare(xs)

这会将列表分解为最后一个元素,但是如何开始比较和组合列表呢?

2 个答案:

答案 0 :(得分:1)

您可以比较给定列表的前两个元素,并将较大的元素保留在列表中,然后删除另一个元素。一旦列表只有一个元素,那么你就有了最大值。在a)的功能伪代码中,它看起来大致如此:

lmax []  = error "empty list"
lmax [x] = x
lmax (x::y::xs) = 
  if x > y then lmax (x::xs)
  else          lmax (y::xs)

对于b)你可以先颠倒列表。

答案 1 :(得分:0)

这是SML list libraryfoldl(或foldr)函数的用途:

foldl : ((`a * `b) -> `b) -> `b -> `a list -> `b

您可以简单地添加一个匿名函数来将当前元素与累加器进行比较:

fun lMax l =
    foldl (fn (x,y) => if x > y then x else y) (nth l 0) l

nth函数只需int list : lint : 0即可返回列表中的第一个元素。由于SML中的列表以递归方式写为:h :: t,因此检索第一个元素是O(1)操作,使用foldl函数可以极大地增加代码的优雅。拥有函数式语言的关键在于定义抽象以将匿名函数作为高阶函数传递,并将抽象类型定义与具体函数一起使用。