如何通过提供一年的两天获得一个月份的int列表?

时间:2013-04-04 22:59:53

标签: functional-programming sml smlnj

编写一个名为month_range的函数,该函数将一年中的两天命名为day_one,将day_two(例如65,128,假设年份为365天)作为输入,并返回其月份的int列表。 此int列表的大小必须为day_two - day_one + 1; 请注意,如果day_one> day_two,list = 0的大小

示例:month_range(25,36) should return [1,1,1,1,1,1,1,2,2,2,2,2] 1月(25,26,27,...,31)和2月(1,2,...,5)

我编写了代码,但它不起作用:

 fun month_range (day1:int,day2:int) =
 let
   val month_days= [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
 fun what_month(day :int) =
   let  
   fun aux(sum :int,  numbers: int list) =
let
  val numbers_tail = tl numbers
in
  if sum <= (hd numbers)
  then 1
  else    
    1 + aux(sum, (hd numbers + hd numbers_tail)::(tl numbers_tail))
end
in
  aux(day, month_days)
end
in
  if (day1>day2)
  then []
  else what_month(day1) @ what_month(day2)
end

1 个答案:

答案 0 :(得分:1)

根据您的previous question,您有一个函数what_month,它将返回一年中某一天的月份数。

您可以非常简单地从day_oneday_two进行迭代,每次调用what_month函数。

现在将它全部放在结果列表中,可以通过将what_month的结果与函数的递归调用连接起来,索引加1,当索引达到{{day_two时与空列表连接。 1}}。