这个堆栈溢出线程声称每个递归函数都可以写成一个循环。如何重写递归函数来代替使用循环?
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