0

我有一个基本上是一个循环的方法,它每次都会在最后调用自己。当日期到达某个点时,该方法不调用自身的最佳方法是什么?每次迭代都会增加 1 天,并且基本上会处理当天的统计数据。如下所示:

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
4

4 回答 4

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
于 2013-04-22T15:25:19.873 回答
3

每次迭代增加 1 天

您发布的代码并非如此。在您的代码中,您将 1 天添加到开始日期一次,然后您会一遍又一遍地处理相同的日期,因为您递归的是旧日期 ( start_date),而不是递增的日期 ( date)。

当日期到达某个点时,该方法不调用自身的最佳方法是什么?

只需将递归调用放在 an 内,if或者在这种情况下,放在您已经拥有else的 the内。if

于 2013-04-22T15:25:38.263 回答
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
于 2013-04-22T15:24:56.027 回答
0

您必须具有递归函数的基本情况(停止情况);

例子:

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

    loop(date - 1)
end
于 2013-04-22T15:26:21.473 回答