如何解决计算和打印SML中的匹配值
对于分配的参数,我不能使用模式或折叠,这是解决较大问题的特殊方法的玩具示例。
运行代码时,自然会得到一个“ 0”。所以问题是,如何获得a_count的最终值?
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_num
永远不会被调用。 - 您的递归通过返回
0
而不是结果来终止 到目前为止,您已经积累了经验(a_count
)。 - 参数
a_count
之间有些混淆,正如我 被理解保存a_number
和count
的出现次数 在第二行声明。
这里有一些更正:
fun num_counter(numbers: int list,a_number: int) = let
fun count_num(numbers: int list,count: int) =
if null numbers
then count (* reached the end of the list =>
returned the number of occurences computed *)
else if (hd numbers) = a_number
then count_num(tl numbers,count + 1)
else count_num(tl numbers,count)
in
count_num (numbers,0) (* first call of count_num,count initiated to 0 *)
end;
还请注意,您可以使用模式匹配来增强内容的可读性 您的递归函数:
fun num_counter(numbers: int list,a_number: int) =
let fun count_num([],count) = count
| count_num(i :: tl,count) =
count_num(tl,if i = a_number then count + 1 else count)
in
count_num (numbers,0)
end;
,
您可以使用折叠将其写得更短:
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
在访问每个数字时累积结果,b_number
中的numbers
,total
的初始值是0
,数字要翻过来,numbers
。 foldl
访问了最后一个号码后,它将使用total
中的最后一个累积作为结果。
foldl
本身是定义的like this:
fun foldl f e [] = e
| foldl f e (x::xr) = foldl f (f(x,e)) xr
或者您可以filter
并购买length
,费用会更高:
fun num_counter (numbers,a_number) =
length (filter (fn b_number => a_number = b_number) numbers)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。