如何计算Haskell中的递归时间?

时间:2017-01-22 14:10:24

标签: haskell recursion

我正在尝试编写一个函数,给定两个日期,使用递归计算两个日期之间的距离(以天为单位)。函数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

2 个答案:

答案 0 :(得分:2)

实际上,你不需要记住它,即使你可以这样做,也可以将它从呼叫转移到呼叫作为参数。

让我们回答两个问题:

  1. 递归的基本情况是什么? 确切地说,两个日期相同时;那么距离是0。

  2. 什么是递归步骤? 好吧,如果日期f和s不相等,我们搜索nextDate(而不是第二天!),我们称之为f1。 f1距离f有一天,但距离s更近一天。 f2(= nextDate f1)距离f有两天,但更接近s。所以:dateDistance f s = 1 + dateDistance f1 sdateDistance f1 s = 1 + dateDistance f2 s

答案 1 :(得分:1)

您需要通过递归调用显式传递“n”。将其作为dateDistance函数的额外参数,并将n+1放入递归调用中。然后用初始值0调用它。

您可以将dateDistance函数重命名为其他内容并重写dateDistance以使用初始值0调用它。