我一直對此很好奇。這實在是很容易的,優雅爲人類創造一個無尾遞歸函數來得到的東西複雜,但速度很慢,而且很容易打的Python遞歸的限制:如何將此非尾遞歸函數轉換爲循環或尾遞歸版本?
def moves_three(n, ini=0, med=1, des=2):
'''give a int -> return a list '''
if n == 1:
return ((ini,des),)
return moves_three(n-1, ini=ini, med=des, des=med) + \
((ini, des),) + \
moves_three(n-1, ini=med, med=ini, des=des)
if __name__ == '__main__':
moves_three(100) # may be after several hours you can see the result.
len(moves_three(10000))
那麼,如何改變moves_three
到尾遞歸一個或一個循環(更好)?更重要的是,有沒有什麼散文可以談論這個?謝謝。
[Python不做尾部優化](http://neopythonic.blogspot.in/2009/04/tail-recursion-elimination.html),所以不要打擾做一個尾遞歸版本:) – thefourtheye
@ thefourtheye謝謝我知道這一點。 Python有TCO的方法,我知道兩種方式,所以兩者都OK ... – tcpiper
@thefourtheye但他們可以[迭代](http://micheles.googlecode.com/hg/decorator/documentation3.html#dealing-與第三方裝飾者),解決遞歸問題。 :) – pradyunsg