只有一個遞歸調用遞歸函數通常可以變成一尾遞歸函數沒有太多的精力,然後它的瑣碎把它轉換成一個迭代函數。這裏典型的例子是階乘:
# 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