2016-12-09 13 views
0

中に私が検索し、ここで見つける同じ問題を持つ人を発見した: Python daysBetweenDate無限ループ日付カウンター

がしかし、彼らのコードは私よりも異なっている、と私は中で指摘された問題に対処するように見えますその投稿の回答。

私のコードでは、なぜ無限ループに陥っているのか分かりません。

限り、私が理解できるよう、daysBetweenDatesがdateIsBeforeがTrueになった場合、その後の間の日数まで追加すべき、限りdateIsBeforeはFalseを返すよう、日にnextDay機能や+1を実行している
def leap_year_check(year): 
    if (year%4==0 and year%100==0 and year%400==0) or (year%4==0 and year%100!=0): 
     return True 
    else: 
     return False 
    #TESTED-leap_year_check-PASSED 

def nextDay(year, month, day): 
    if month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10 or month == 12 and day < 31: 
     return year, month, day + 1 
    if month == 4 or month == 6 or month == 9 or month == 11 and day < 30: 
     return year, month, day + 1 
    if month == 2 and day <28: 
     return year, month, day + 1 
    if month == 2 and leap_year_check(year)==True and day==28: 
     return year, month, day + 1 
    else: 
     if month == 12: 
      return year + 1, 1, 1 
     else: 
      return year, month + 1, 1 
    #TESTED nextDay - PASSED 

def dateIsBefore(year1, month1, day1, year2, month2, day2): 
    if year1 < year2: 
     return True 
    if year1 == year2: 
     if month1 < month2: 
      return True 
     if month1 == month2: 
      return day1 < day2 
    return False   
    #TESTED dateIsBefore - PASSED 

def daysBetweenDates(year1, month1, day1, year2, month2, day2): 
    assert not dateIsBefore(year2, month2, day2, year1, month1, day1) 
    days = 0 
    while dateIsBefore(year1, month1, day1, year2, month2, day2): 
     year1, month1, day1 = nextDay(year1, month1, day1) 
     days += 1 
    return days 
    #***Keep running into infinite loop when testing daysBetweenDates 
    #ALL other functions operate correctly when tested on their own 
    #ALL other functions work together EXCEPT when running daysBetweenDates 

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" 
     else: 
      print "Test case passed!" 

test() 

私は明らかに何かが不足しています。

私はこのことについて非常に非効率的であると考えていますが、それは学習目的であり、私はまだ最適化に焦点を当てる必要がありません。今はコードを動作させる方法を理解しようとしています。

ご協力いただければ幸いです。

答えて

2

コードを学習することの一部がデバッグを学習しています。 days1、month1、day1の現在の値をdaysBetweenDates内のwhileループ内に表示するprintステートメントを入れてみましょう。次の日はちょうどその日を増分し、月または年を増やすことはありません。