我想我可能有一个无限循环,因为我每次运行代码时都会收到一条错误消息,上面写着“程序因使用13个CPU秒而关闭”。
整个代码,应该以一个日期作为输入,并在第二天输出,这个代码假设所有月份都是30天除了daysBetweenDates功能外,其他功能似乎都工作正常。有人有什么建议吗或者也许有人能告诉我我错过了什么?

def daysInMonth(year, month):
        return 30

def nextDay(year, month, day):
    if day < 30:
        return year, month, day + 1
    else:
        if month == 12:
            return year + 1, 1, 1
        else:
            return year, month + 1, 1
        return

def dateIsBefore(year1, month1, day1, year2, month2, day2):
    if year1 < year2:
        return True

def daysBetweenDates(year1, month1, day1, year2, month2, day2):
    days = 0
    while dateIsBefore(year1, month1, day1, year2, month2, day2):
        days += 1
    return days

def test():
    test_cases = [((2012,1,1,2012,2,28), 58),
                  ((2012,1,1,2012,3,1), 60),
                  ((2011,6,30,2012,6,30), 366),
                  ((2011,1,1,2012,8,8), 585 ),
                  ((1900,1,1,1999,12,31), 36523)]
    for (args, answer) in test_cases:
        result = daysBetweenDates(*args)
        if result != answer:
            print "Test with data:", args, "failed"
            print result
        else:
            print "Test case passed!"
test()

最佳答案

你的daysBetweenDates()算法确实有一个无限循环。

while dateIsBefore(year1, month1, day1, year2, month2, day2):
    days += 1

您永远不会在循环中修改任何年/月/日值,因此,如果条件为true,则它将永远为true。
从概念上讲,解决方案是每次将day2减少一个,因此当两个日期相等时,days将是它们之间的日差。然而,既然你说你假设每个月有30天,你就为自己过度复杂化了通过将(年、月、日)元组转换为日值,可以找到两个日期之间的日差。例如,
def days_between_dates(y1, m1, d1, y2, m2, d2):
    date1 = y1*360 + (m1-1)*30 + d1
    date2 = y2*360 + (m2-1)*30 + d2
    # assuming you want to return 0 if date2 is before date1
    return date2 - date1 if date2 >= date1 else 0

09-26 16:20