gpt4 book ai didi

list - number_in_month 练习(SML 列表迭代)

转载 作者:行者123 更新时间:2023-12-02 07:04:36 25 4
gpt4 key购买 nike

我需要获取一个日期列表和一个月份列表,并计算列出的任何月份中的日期总数。因此返回一个整数

我有一个先前定义的 number_in_month 函数,它接受一个列表日期和单个月份并返回属于该月份的日期数量月。它已经过测试并且可以正常工作。我以此为基础后一个功能。我已经通过 number_in_months 函数追踪了很多次次,我似乎无法找出问题所在,但它根本没有给出正确的答案

fun number_in_month (datelist : (int*int*int)list, month : int)  = 

let
fun count(x : int , datelist : (int*int*int)list)=
if null (tl datelist)
then x
else if #2(hd datelist) = month
then count(x+1, tl datelist)
else count(x, tl datelist)

in

if #2(hd datelist) = month
then count(1, datelist)
else count(0, datelist)

end
fun number_in_months (datelist : (int*int*int)list, monthlist : (int)list)=
let
fun count(x : int, monthlist : (int)list)=
if null (tl monthlist)
then x
else count((x + number_in_month(datelist, hd monthlist)), tl monthlist)

in
count (( number_in_month(datelist, hd monthlist), tl monthlist))
end

最佳答案

如您所述,您只需使用之前的函数 number_in_month。请记住,number_in_month 获取日期列表和单个月份,并返回日期列表中匹配的月份数。因此,创建 number_in_months 所需要做的就是为新的月份列表中的每个元素调用 number_in_month,并检查原始日期列表。

这样的解决方案看起来像

fun number_in_months (dates, months) =
if null months then
0
else
number_in_month(dates, hd months) + number_in_months(dates, tl months)

但是当你使用模式匹配时,你可以缩短它并使其更具可读性

fun number_in_months (dates, []) = 0
| number_in_months (dates, d::ds) =
number_in_month(dates, d) + number_in_months(dates, ds)

绝对没有理由创建一个带有“状态”的count 函数。这似乎是你的当务之急,在起作用:)以这个简单的函数为例,它将对列表的所有元素求和

fun sum [] = 0
| sum (x::xs) = x + sum xs

甚至创建一个长度函数(实际上类似于您的计数函数)

fun length [] = 0
| length (x::xs) = 1 + length xs

我鼓励您阅读这些 questions,而不是重复已经多次提到的很多好东西。以及他们的答案。

更新

我还想向您展示如何以更好的方式格式化您的代码

fun number_in_month (datelist : (int*int*int) list, month : int)  =
let
fun count (x : int , datelist : (int*int*int) list) =
if null (tl datelist)
then x
else if #2(hd datelist) = month
then count (x+1, tl datelist)
else count (x, tl datelist)
in
if #2(hd datelist) = month
then count (1, datelist)
else count (0, datelist)
end


fun number_in_months (datelist : (int*int*int) list, monthlist : int list)=
let
fun count (x : int, monthlist : int list)=
if null (tl monthlist)
then x
else count (x + number_in_month(datelist, hd monthlist), tl monthlist)
in
count (number_in_month (datelist, hd monthlist), tl monthlist)
end

如何格式化嵌套的 if's 一直是我来自哪里的一个很大的争论。就我个人而言,我避免使用它们,而是使用案例,但我想您将来会了解它。

但是我也发现了您的计数函数中的一个错误。当你测试你的第二个参数(在你的两个计数函数中)是否是带有 null 的空列表时,你在参数的尾部执行它,如果参数实际上是空的,它将失败列表

- null (tl []);

uncaught exception Empty

例如这个输入

- number_in_months ([(1,1,1)], [1]);

uncaught exception Empty

您在 number_in_month 中的逻辑也是错误的,因为您正在测试 datelist 的头部是否等于 month,但是您count 在任何一种情况下都使用整个 datelist 而不是它的尾部。这被视为下面不应返回 2 的结果

- number_in_month([(1,1,1), (2,2,2), (3,3,3)], 1);
val it = 2 : int

这个错误是唯一让 number_in_month 函数没有抛出异常的原因。

关于list - number_in_month 练习(SML 列表迭代),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14470895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com