【问题标题】:Recursion in pythonpython中的递归
【发布时间】:2019-05-13 15:13:15
【问题描述】:

我对在 python 中使用递归有一个概念上的疑问。 下面是我从this page at geeksforgeeks复制的仅使用递归来反转堆栈的python代码。

# Below is a recursive function that inserts an element
# at the bottom of a stack.
def insertAtBottom(stack, item):
    if isEmpty(stack):
        push(stack, item)
    else:
        temp = pop(stack)
        insertAtBottom(stack, item)
        push(stack, temp)
# Below is the function that reverses the given stack
# using insertAtBottom()

def reverse(stack):
    if not isEmpty(stack):
        temp = pop(stack)
        reverse(stack)
        insertAtBottom(stack, temp)

似乎函数reverse 使用stack 作为全局变量,因为被调用函数没有向调用函数返回任何新值。这不是实现递归的错误方式吗?我们不应该避免在堆栈中使用全局变量吗?

另外,我们如何编辑这个函数,使得被调用函数的每个实例都使用它自己的stack 副本?

【问题讨论】:

  • 请尝试将您的句子分解为“我希望...函数”。这很头疼..
  • stack 不是全局的,它被传递到函数中。

标签: python recursion


【解决方案1】:

编辑:修改措辞,使其与所使用的术语更加一致。

stack 不是全局变量,它是函数的参数。您可以将其想象为对调用函数之前在其他地方创建的堆栈对象实例的引用。 对参数进行操作实际上是修改了它所引用的对象。

【讨论】:

  • 您有很多类似的术语,variableparameterreference,但您使用它们的方式非常不一致,甚至是错误的。
  • 请详细说明您的评论。我更新了我的答案,使其更清晰,更符合条款,但我找不到任何我不正确使用条款的地方。
  • 我遇到的一个问题是stack 不是一个变量,而是一个参数。现在你正在区分范围,好多了。您还说对参数进行操作会修改原始变量,这令人困惑。在某些方面,Python 没有变量。命名引用对象。您可以更改名称以引用不同的对象,也可以修改该对象。所以我喜欢你现在说它修改了参数引用的对象。
【解决方案2】:

pushpop 将修改 stack 为其命名的对象。到处都提到stack,它是同一个对象的名称,因为它作为名为@9​​87654327@ 的参数传递给reverseinsertAtBottom。没有对象被复制,它们也不是全局的。您可以将参数命名为不同的名称,但它仍会引用同一个对象。

将使用您传递给reverse 函数的任何内容。它不是全局的,您可以控制使用哪个对象。

my_stack = []
reverse(my_stack)  # uses object *my_stack*

【讨论】:

    【解决方案3】:

    函数调用本身称为递归函数,此过程称为递归。更多详细信息this can help

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 2013-12-11
      • 2012-11-24
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多