统计并打印SML中的匹配值
根据赋值的参数,我不能使用模式或折叠,这是一个关于更大问题的特定方法的玩具示例 当我运行代码时,自然会得到一个“0”。所以问题是,我如何得到一个u计数的最终值统计并打印SML中的匹配值,sml,smlnj,Sml,Smlnj,根据赋值的参数,我不能使用模式或折叠,这是一个关于更大问题的特定方法的玩具示例 当我运行代码时,自然会得到一个“0”。所以问题是,我如何得到一个u计数的最终值 fun num_counter(numbers: int list, a_number: int) = let val count = 0 in let fun count_num(numbers: int list, a_count: int) =
fun num_counter(numbers: int list, a_number: int) =
let val count = 0
in
let fun count_num(numbers: int list, a_count: int) =
if null numbers
then 0
else if (hd numbers) = a_number
then count_num(tl numbers, count + 1)
else count_num(tl numbers, count)
in
count
end
end
您的代码有几个问题:
count\u num
从未被调用0
而不是结果来终止
到目前为止,您已经累计了(a_count
)a_count
之间存在一些混淆,如
Understand保存a_编号
和计数
在第二行声明fun num_计数器(数字:int列表,数字:int)=let
乐趣计数(数字:整数列表,计数:整数)=
如果为空数字
然后计数(*到达列表末尾=>
返回计算的发生次数*)
else if(hd编号)=一个_编号
然后计数(tl数,计数+1)
else count_num(tl编号、计数)
在里面
count_num(number,0)(*count_num的第一次调用,
计数已初始化为0*)
结束;
还请注意,您可以使用模式匹配来增强
递归函数:
fun num_计数器(数字:int列表,数字:int)=
让乐趣计数\u num([],计数)=计数
|计数(i::tl,计数)=
count_num(tl,如果i=a_数,则count+1,否则计数)
在里面
计数(数字,0)
结束;
您可以使用折页将其缩短:
fun num_counter (numbers, a_number) =
let fun count (b_number, total) =
if a_number = b_number
then total + 1
else total
in foldl count 0 numbers
end
这里foldl
接受三个参数:函数count
在访问每个数字时累积结果,numbers
中的b_number
,total
的初始值为0
和要折叠的数字,numbers
。当foldl
访问了最后一个号码时,它使用total
中的最后一次累积作为结果
foldl
本身定义如下:
或者您可以筛选
并获取成本稍高的长度
:
fun num_counter (numbers, a_number) =
length (filter (fn b_number => a_number = b_number) numbers)
这很有效。我还不太清楚什么时候会进入“in”条款。
fun num_counter (numbers, a_number) =
length (filter (fn b_number => a_number = b_number) numbers)