(sml)我想计算列表中相应值的数量

(sml)我想计算列表中相应值的数量,sml,Sml,我想知道1美元可以用1,5,10,20,50美分表示的案例数量。 例如,计数(100,[50,25])是: 因为50*1+25*2,it=3:int被打印。 但是,在我的代码中,只打印列表的前面部分,因此即使我计数(100,[50,25]),也会打印it=2:int。 换句话说,我的代码没有利用整个列表。 我如何解决这个问题 SML硬币计数功能: fun count(x,[]) = 0 | count (x,y::ys) = let val cnt = 0 in if y*2 = x then

我想知道1美元可以用1,5,10,20,50美分表示的案例数量。 例如,
计数(100,[50,25])
是: 因为50*1+25*2,
it=3:int被打印。
但是,在我的代码中,只打印列表的前面部分,因此即使我
计数(100,[50,25])
,也会打印
it=2:int。
换句话说,我的代码没有利用整个列表。 我如何解决这个问题

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])
的测试表达式时会发生什么

cnt
0
y
50
ys
[25]

y
2
等于
100
,因此它返回
cnt+2
,即
2
。没有进一步的事情发生

当涉及递归时,请记住,函数的参数列表是您的通信方式。似乎
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

首先,谢谢你的帮助。我实际上在标准ML中自学。所以我认为没有任何地方可以得到帮助,所以我想再问你一次。可以吗?我知道y中有50个,y中有25个。但由于y是50,cnt增加1,ys是25,cnt增加2,当y+ys变成x时,您需要创建一个返回cnt的函数。但是当我写x=y+ys时,我得到了一个错误。这个列表的方法是错误的吗?那怎么去呢?嗯,对不起。我想我没有详细解释过。我所做的功能只是找到案例的数量。例如,如果输入值是count(100,[50,25]),则输入值可以是100到50和25。有三种方式:50、50、(25、25、25)和25。因此,要在列表中y=50,ys=25时编写一个函数,我们需要一个可以比较当前元素y和下一个元素y的函数。但是由于没有数据,sml是不可能的。我很怀疑。如果你知道任何可能的方法,我能得到一些帮助吗?