【问题标题】:Iterative to recursion function for non-tail recursive methods非尾递归方法的递归函数迭代
【发布时间】:2016-04-07 20:09:51
【问题描述】:

我正在尝试为以下递归程序编写迭代方法。我尝试了多种方法,但无济于事。

我也尝试过谷歌搜索,但无法弄清楚。有人能给我一些关于如何处理它的想法吗?

请注意,我的函数是非尾递归的。在递归结束时我还有一些事情要做

def rec(i,j):
  print "Inside funciton ", i, j
  if i == 3:
    return
  if j == 3:
     return
  rec(i+1,j)
  # Some code
  rec(i,j+1)
  # Some code

rec(0,0)

输出:

Inside funciton  0 0
Inside funciton  1 0
Inside funciton  2 0
Inside funciton  3 0
Inside funciton  2 1
Inside funciton  3 1
Inside funciton  2 2
Inside funciton  3 2
Inside funciton  2 3
Inside funciton  1 1
Inside funciton  2 1
Inside funciton  3 1
Inside funciton  2 2
Inside funciton  3 2
Inside funciton  2 3
Inside funciton  1 2
Inside funciton  2 2
Inside funciton  3 2
Inside funciton  2 3
Inside funciton  1 3
Inside funciton  0 1
Inside funciton  1 1
Inside funciton  2 1
Inside funciton  3 1
Inside funciton  2 2
Inside funciton  3 2
Inside funciton  2 3
Inside funciton  1 2
Inside funciton  2 2    
Inside funciton  3 2
Inside funciton  2 3
Inside funciton  1 3
Inside funciton  0 2
Inside funciton  1 2    
Inside funciton  2 2
Inside funciton  3 2
Inside funciton  2 3
Inside funciton  1 3
Inside funciton  0 3

【问题讨论】:

  • 为什么? (因为有 2 次递归调用,您必须使用一些足够复杂的代码,可能使用堆栈来模拟该递归)...也许您正在寻找 memoization
  • 谢谢,是的,memoization 也可以,但是我什么时候应该存储结果?...在​​两个递归调用之后?即在r​​ec(i+1,j) 之后和rec(i,j+1) 之后或者只是在最后就足够了?(即在rec(i,j+1) 之后)?

标签: python loops recursion iteration


【解决方案1】:

如果函数不是尾递归的,则需要处理显式堆栈...例如

todo = [(0, 0)]
while todo:
    i, j = todo.pop()
    print "processing ", i, j
    if i != 3 and j != 3:
        todo.append((i, j+1))
        todo.append((i+1, j))

【讨论】:

    猜你喜欢
    • 2011-11-14
    • 2016-05-09
    • 2016-07-21
    • 2012-10-05
    • 2018-03-17
    • 1970-01-01
    • 2016-06-14
    • 2010-10-20
    • 2019-09-14
    相关资源
    最近更新 更多