问题描述
有人问过类似的问题,普遍的共识是任何东西都可以从递归转换为 for 循环,反之亦然。但是,我找不到将以下伪代码类型的函数转换为 for 循环的方法:
def recursive(n):
if n == 0:
return
for i in range(some_number):
do_sth...
recursive(n-1)
在这种情况下,有 n 个嵌套循环,n 根据给定的参数而变化。当只使用 for 循环时,嵌套循环的数量似乎总是在代码中预先确定的,它不会根据“输入”而变化。有没有办法只使用 for 循环来制作这样的东西?
解决方法
有没有办法只使用 for 循环来做这样的事情?
好吧,如果您承认 while 循环是伪代码 for 循环的一种情况,那么至少可以制作您的示例:
def nonrecursive(n):
a = []
z = 0
while n:
while n:
i = z
if i == some_number: break
print((n,i))
a += [[n,i]]
n -= 1
z = 0
if not a: break
n,i = a.pop()
i += 1
z = i
,
我们在这里需要小心。
一般正确的说法是循环可以代替递归,反之亦然。这可以通过多种方式展示;有关想法,请参阅结构化编程定理。
for 循环是否可以代替递归取决于您的定义。您的 for 循环是否可以永远运行,或者在事先不知道的无限时间内运行?如果是这样,它们在功能上等同于 while 循环,并且它们可以替代递归。如果您的 for 循环无法永远运行或迭代次数未知(初始),则无法始终替换递归。
真的,它是 while 循环(加上一个堆栈数据结构)可以毫无困难地取代递归。