标准ML - 返回列表中给定值的出现次数

时间:2013-10-06 21:55:25

标签: recursion sml ml

我正在试图弄清楚如何返回另一个列表中特定值的出现次数列表。 即 索引(1,[1,2,1,1,2,2,1]); val it = [1,3,4,7] int list

我正在试图弄清楚列表如何工作并试图在递归方面做得更好所以我不想使用List.nth(或任何库函数)而我不想进入模式匹配安静

这是我到目前为止所拥有的

fun index(x, L) =
if null L then 0
else if x=hd(L) then 
    1
else 
    1 + index(x,tl L);

fun inde(x, L) =
if null L then []
else if x=hd(L) then 
    index(x, tl L) :: inde(x, tl L)
else
    inde(x, tl L);

index(4, [4,2,1,3,1,1]);

inde(1,[1,2,1,1,2,2,1]);

这给了我类似[2,1,3,0]的东西。我想我只是很难适当地增加事情以获得索引。索引函数本身可以正常工作。

2 个答案:

答案 0 :(得分:1)

相反,你也可以在列表上进行两次传递:首先为列表中的每个元素添加一个索引,然后再绘制正确元素的索引:

fun addIndex (xs, i) =
    if null xs then []
    else (hd xs, i) :: addIndex(tl xs, i+1)

fun fst (x,y) = x
fun snd (x,y) = y
fun indexi(n, xs) =
    if fst(hd xs) = n then ... :: indexi(n, tl xs)
    else indexi(n, tl xs)

(我遗漏了indexi部分的练习。) addIndex([10,20,30],0)为您提供[(10,0),(20,1),(30,2)]的位置。现在,您可以使用addIndexindexi来实现原始index功能:

fun index(n, xs) = indexi(n, addIndex(xs, 0))

当你开始工作时,可以尝试将addIndexindexi合并到一个同时执行这两项操作的函数中。

但是,你真的想用模式匹配来编写它,参见例如使用模式编写的addIndex

fun addIndex ([], _) = []
  | addIndex (x::xs, i) = (x,i) :: addIndex(xs, i+1)

答案 1 :(得分:0)

如果你做索引(1,[2]),它给出1,这是不正确的。当列表为空时,它会给你零。在这样的函数中,您可能想要使用SOME / NONE功能。