【发布时间】:2011-07-16 20:37:53
【问题描述】:
这个堆栈溢出线程声称每个递归函数都可以写成一个循环。
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 语句。
-
个人......我认为它可以解决,但你需要引用一些变量来管理你的递归是在循环内执行的事实......因此你需要存储循环位置和你通过递归的方向......可以说是“进入”或“离开”。
-
是的,您可以使用相同的算法并假装自己是解释器并管理您自己的堆栈。或者,您可以提出一种迭代算法来生成排列,这将更容易表示为循环。
-
您有这样做的理由吗?这纯粹是教育吗?任何递归函数都可以在没有递归的情况下实现(因为最终递归是迭代),但并不是每个递归算法都应该迭代地实现。递归是表达许多算法的自然方式。
-
@Glenn Maynard:我正在尝试用 C 语言编写一个程序,以解决以前未解决的特定问题(用于流行的电视游戏节目)。我相信我可以使用蛮力方法解决问题,所以我想看看我是否能做到! C没有堆栈限制吗?我的搜索空间很大!
标签: python loops recursion permutation