這個堆棧溢出線程聲稱每個遞歸函數都可以寫成一個循環。如何重寫遞歸函數來代替使用循環?
Which recursive functions cannot be rewritten using loops?
它使完整意義上的。但我不知道如何將下面的遞歸函數表示爲循環,因爲它有一個預先遞歸的邏輯和後遞歸邏輯。
很明顯,該解決方案無法使用goto語句。該代碼是在這裏:
def gen_perms(lst, k, m):
if k == m:
all_perms.append(list(lst))
else:
for i in xrange(k, m+1):
#swap char
tmp = lst[k]
lst[k] = lst[i]
lst[i] = tmp
gen_perms(lst, k+1, m)
#swap char
tmp = lst[k]
lst[k] = lst[i]
lst[i] = tmp
調用它會是這樣:
all_perms = []
gen_perm([1, 2, 3], 0, 2)
和它產生的列表1,2,3的每一個排列。
@nmichaels:Python沒有goto語句。 – 2011-03-16 18:59:33
個人...我認爲它可以解決,但你需要引用一些變量來管理你的遞歸在一個循環內執行的事實...因此你需要存儲循環的位置和你通過遞歸...「變成」或「變成」可以這麼說。 – Philluminati 2011-03-16 19:06:18
是的,你可以使用相同的算法並假裝成解釋器並管理自己的堆棧。或者,你可以想出一個用於生成排列的迭代算法,這將更容易表達爲循環。 – nmichaels 2011-03-16 19:08:44