2013-04-22 176 views
0

我有一個基本上是一個循環的方法,它每次都在結尾調用它自己。當日期到達某個點時,該方法不能自行調用的最佳方法是什麼?每次迭代都會增加1天,並基本處理當天的統計數據。它看起來像下面這樣:Ruby,遞歸方法

def loop(start_day) 
    date = start_day 

    #do a bunch of stuff 

    date = date +1.day 

    if date > Time.now 
    puts "loop should be over" 
    end 

    loop(date) 
end 
+0

糾正我,如果我錯了,但不會使用遞歸保持複利取決於你在設置變量的內存使用'#do一堆stuff'的,而一個'直到'循環會清除每個循環的變量? – 2013-04-22 16:21:58

+0

@CharlesCaldwell不言而喻(至少,我認爲......)在現實生活中這將是一件愚蠢的事情。我認爲這只是一個練習。 – 2013-04-22 16:45:25

+1

請注意,在這種情況下您不需要遞歸。你可以爲日期創建一個範圍,然後迭代該範圍的每個日期。 – 2013-04-22 16:51:32

回答

3

通過重複都會1天

這不是對你發佈的代碼實現。在您的代碼優1號添加一天的開始日期一次然後你繼續一遍遍處理同日再次因爲你遞歸的舊日期(start_date),而不是遞增日期(date)。

該方法在日期到達特定點時不會自行調用自己的最佳方式是什麼?

只要把遞歸調用的if內,或者在這種情況下,你已經有了ifelse內。

+0

固定,對不起,好的,謝謝! – BC00 2013-04-22 15:27:23

1

這是怎麼回事?

def loop(start_day) 
    return "loop should be over" if start_day >= Time.now 
    #... 
    loop(modified_date) 
end 

或...

def loop(start_day) 
    date = start_day.dup 
    time = Time.now 
    date += 1.day while date <= time 
    'loop should be over' 
end 

好像要將所有天,從開始日期到今天迭代。那麼也許這是更簡單:

def map_date(date) 
    (date.to_date..Date.today).map do |d| 
    d.strftime("Today is %A") 
    end 
end 
3

既然你設置datestart_date立即,似乎有一個在兼具沒有意義的。這裏是做遞歸的更規範形式:

def loop(date) 
    return if date > Time.now 
    #do a bunch of stuff 
    loop(date + 1.day) 
end 

更新:如果不是很明顯你,遞歸是沒有必要在這裏,在現實生活中,那就更有意義,做這樣的事情:

def process_from(date) 
    while date <= Time.now 
    # Process date 
    date += 1.day 
    end 
end 
0

您必須爲遞歸函數基本情況(停止的情況下);

例如:

def loop(date) 
    if date == certain_point 
     return [something_for_stop] 
    end 

    loop(date - 1) 
end