【问题标题】:Can a recursive function containing a for loop that contains a call of the mentioned function be implemented using only for loops?是否可以仅使用 for 循环来实现包含 for 循环的递归函数,该循环包含对上述函数的调用?
【发布时间】:2021-05-24 20:52:18
【问题描述】:

已经提出了类似的问题,并且普遍的共识是任何东西都可以从递归转换为 for 循环,反之亦然。但是,我找不到将以下伪代码类型的函数转换为 for 循环的方法:

def recursive(n):
    if n == 0:
        return
    for i in range(some_number):
        do_sth...
        recursive(n-1)

在这种情况下,有 n 个嵌套循环,n 根据给定的参数而变化。仅使用 for 循环时,嵌套循环的数量似乎总是在代码中预先确定,它不会因“输入”而异。有没有办法只使用 for 循环来制作这样的东西?

【问题讨论】:

  • 您所指的共识是特定于具有预定循环数的循环吗? IMO这没有意义......也许只是“函数调用自身的每个算法都可以在没有函数实际调用自身的情况下实现”?
  • @obe 的共识是,任何可以使用这些实现的东西都可以使用另一个实现。换句话说,是的,就是你说的,但在我看来,它不适用于嵌套循环的数量没有预先确定的情况。
  • 在“最坏的情况下”,您可以实现一个本地堆栈数据结构和一个模拟递归的无限循环。这可以在所有情况下工作,并且您不会有一个函数调用自己,但我不确定它是否仍会被视为“不使用递归”,因为它只是移动由生成的与堆栈相关的指令编译器(以及像CALLRET这样的硬件级指令)到你的“用户空间”代码。但是,当您的嵌套对于可用的“内置”堆栈大小而言太深时,它可以帮助解决堆栈溢出问题)。

标签: loops for-loop recursion nested-loops theory


【解决方案1】:

我们需要在这里小心。

一般的正确说法是循环可以代替递归,反之亦然。这可以通过多种方式展示;见结构化编程定理的想法。

for 循环是否可以替代递归取决于您的定义。你的 for 循环可以永远运行,还是可以无限期地运行,而不是事先不知道的?如果是这样,它们在功能上等同于 while 循环,它们可以代替递归。如果您的 for 循环不能永远运行或迭代次数未知(初始),则不能总是替换递归。

确实,是 while 循环(加上堆栈数据结构)可以轻松替代递归。

【讨论】:

    【解决方案2】:

    有没有办法只使用 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
    

    【讨论】:

      猜你喜欢
      • 2019-01-23
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      相关资源
      最近更新 更多