2013-04-22 125 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