一个只有一次递归调用的递归函数通常可以不费太多力气就变成尾递归函数,然后再转换成迭代函数就很简单了。这里的典型例子是阶乘:
# 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
现在,您的情况比这要困难得多:一个简单的累加器将很难用一个指向需要生成子树的指针来表达一个部分构建的树。你会想要一个拉链——用 Python 这样的非真正功能语言来实现并不容易。