返回更大的元组值

时间:2013-10-27 18:18:49

标签: list recursion sml mode ml

我正在尝试查找列表的模式,并返回模式的元组以及它在列表中出现的次数。 我有一个点,我可以返回每个数字的列表和之后发生的次数,但它也让我出现在第一个数字之后,

fun counter(_, nil) = 0
  | counter(a, x::xs) = if a = x then 1+counter(a, xs)
            else counter(a, xs);

fun countList(nil) = []
  | countList(x::xs) =
    (x, counter(x, x::xs))::countList(xs);

val lst = countList([1,2,1,1,3,4,5,2,1,2,1]);

给我val lst = [(1,5),(2,3),(1,4),(1,3),(3,1),(4,1),(5,1) ,(2,2),(1,2),(2,1),(1,1)]   :(int * int)list

哪个应该不是问题,只需循环遍历每个值,看看第一个值是否相等,然后只给出第一个值,然后只返回最大值,但我似乎无法计算出来部分出局。 我想我只是在遍历列表时遇到问题,并与我正在检查的当前值进行比较。

1 个答案:

答案 0 :(得分:1)

计算lst列表后,您不需要在其中找到匹配的元素。您唯一需要做的就是遍历列表以找到具有最大元组秒值的元素。

fun findMax l =
  let fun find (nil, acc) = acc
  | find ((value, count)::xs, (acc_value, acc_count)) =
    if count > acc_count then find (xs, (value, count))
    else if value = acc_value then (acc_value, acc_count)
    else find (xs, (acc_value, acc_count))
  in find (l, (0, 0)) end;

findMax lst;
val it = (1, 5): int * int

然而,该解决方案具有O(n 2 )复杂性。或者,您可以先在O(n * log n)时间内对元素进行排序,然后从列表中返回最大出现次数的第一个元素(或多个元素)。