(sml)我想计算列表中相应值的数量
我想知道1美元可以用1,5,10,20,50美分表示的案例数量。 例如,(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
计数(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是不可能的。我很怀疑。如果你知道任何可能的方法,我能得到一些帮助吗?