只有一个递归调用递归函数通常可以变成一尾递归函数没有太多的精力,然后它的琐碎把它转换成一个迭代函数。这里典型的例子是阶乘:
# naïve recursion
def fac(n):
if n <= 1:
return 1
else:
return n * fac(n - 1)
# tail-recursive with accumulator
def fac(n):
def fac_helper(m, k):
if m <= 1:
return k
else:
return fac_helper(m - 1, m * k)
return fac_helper(n, 1)
# iterative with accumulator
def fac(n):
k = 1
while n > 1:
n, k = n - 1, n * k
return k
但是,你的情况下,这里涉及到两个递归调用,除非你显著返工你的算法,你需要保持一个堆栈。管理自己的堆栈可能比使用Python的函数调用堆栈快一点,但增加的速度和深度可能不值得这样复杂。这里典型的例子是斐波那契序列:
# naïve recursion
def fib(n):
if n <= 1:
return 1
else:
return fib(n - 1) + fib(n - 2)
# tail-recursive with accumulator and stack
def fib(n):
def fib_helper(m, k, stack):
if m <= 1:
if stack:
m = stack.pop()
return fib_helper(m, k + 1, stack)
else:
return k + 1
else:
stack.append(m - 2)
return fib_helper(m - 1, k, stack)
return fib_helper(n, 0, [])
# iterative with accumulator and stack
def fib(n):
k, stack = 0, []
while 1:
if n <= 1:
k = k + 1
if stack:
n = stack.pop()
else:
break
else:
stack.append(n - 2)
n = n - 1
return k
现在,你的情况比这更严厉了很多:一个简单的储液器有困难表达部分建造树的指针,其中一个子树必须产生。你会想要一个zipper - 不容易实现在一个非真正功能的语言,如Python。
可能重复的[?可以每递归转换成迭代](http://stackoverflow.com/q/931762/) ,[将递归算法转换为迭代算法的设计模式](http://stackoverflow.com/q/1549943/) – outis 2012-06-20 22:47:02