(sml) 我想统计列表中对应值的个数

(sml) I want to count the number of corresponding values in the list

我想知道 1 美元可以用 1,5,10,20,50 分表示的情况有多少。 例如,count(100,[50,25]) 是: 因为 50 * 1 + 25 * 2, it = 3:int is printed. 但是,在我的代码中,只打印了列表的前面部分,所以即使我 count (100,[50,25]), it = 2:int is printed. 换句话说,我的代码没有利用整个列表。 我该如何解决?

SML算币功能:

fun count(x,[]) = 0
| count (x,y::ys) =
let val cnt = 0
in if y*2 = x then cnt+2
else if y*4 = x then cnt + 4
else if y*10 = x then cnt + 10
else if y*10 = x then cnt + 10
else if y*20 = x then cnt + 20
else count(x-y,ys)
end;

考虑评估 count (100, [50, 25]).

的测试表达式时会发生什么

cnt0y50ys[25]

y 乘以 2 等于 100,所以 returns cnt+22。没有进一步的事情发生。

当谈到递归时,请记住函数的参数列表是您的通信方式。似乎 cnt 应该作为参数传递,以便您可以在递归调用之间更新它。

使用 count(x, []) = 0 你已经有了一个停止递归的退出点。

编辑:根据评论,您似乎在尝试计算列表中每个值进入值 x.

的次数

所以你的递归函数的最终结果不是一个整数。这是一个整数列表。或者更好的是,包含要查找的值的元组,以及它进入 x.

的次数

所以如果列表为空,结果很明显。

fun count(x, []) = []

这是一个空列表。否则,我们需要将一些内容附加到列表中。

fun count(x, []) = []
  | count(x, y::ys) = 
      (y, x div y) :: count(x, ys)

当然,我们也有像map这样的功能,基本上可以为我们做这些。

fun count(x, lst) = List.map (fn y => (y, x div y)) lst