我正在尝试编写一个函数,给定两个日期,使用递归计算两个日期之间的距离(以天为单位)。函数dateDistance
有两个日期,并使用nextDate
查找下一个有效日期。 goodDate
确保其有效日期。
我试图通过计算递归并返回计数来获得结果。每次递归发生时,计数变量n
应该增加,并且在递归结束时,当它到达结束条件(fy == sy && fm == sm && sd == fd) = n
时,它将返回n
。
leapYear x = if ((x `mod` 4) == 0) && ((x `mod` 100) /= 0) || ((x `mod` 400) == 0)
then True
else False
goodDate (y,m,d)
| (d<1 || m>12 || m<1 || y==0) = False
| m `elem` [1,3,5,7,8,10,12] = d<32
| m `elem` [4,6,9,11] = d<31
| leapYear y = d<30
| otherwise= d<29
nextDate (y,m,d) =
if goodDate(y,m,(d+1))
then (y,m,(d+1))
else if goodDate(y,(m+1),1)
then (y,(m+1),1)
else ((y+1),1,1)
dateDistance (fy,fm,fd) (sy,sm,sd)
|(fy == sy && fm == sm && sd == fd) = n
|otherwise = dateDistance nextDate (fy,fm,fd) (sy,sm,sd)
where n = 0
答案 0 :(得分:2)
实际上,你不需要记住它,即使你可以这样做,也可以将它从呼叫转移到呼叫作为参数。
让我们回答两个问题:
递归的基本情况是什么? 确切地说,两个日期相同时;那么距离是0。
什么是递归步骤?
好吧,如果日期f和s不相等,我们搜索nextDate(而不是第二天!),我们称之为f1。 f1距离f有一天,但距离s更近一天。 f2(= nextDate f1
)距离f有两天,但更接近s。所以:dateDistance f s = 1 + dateDistance f1 s
和dateDistance f1 s = 1 + dateDistance f2 s
。
答案 1 :(得分:1)
您需要通过递归调用显式传递“n”。将其作为dateDistance
函数的额外参数,并将n+1
放入递归调用中。然后用初始值0调用它。
您可以将dateDistance
函数重命名为其他内容并重写dateDistance
以使用初始值0调用它。