2017-03-07 81 views
0

我有一个关于在Python中使用递归的概念怀疑。 以下是用于仅使用递归的反转堆栈的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

+0

请尝试打断你的句子*“我希望...的功能”*。这是一个令人头疼的问题。 –

+0

'stack'不是全局的,它被传入函数。 –

回答

0

pushpop将修改对象,其中stack是一个名称。无处不在stack被称为同一个对象的名称,因为它被传递给reverseinsertAtBottom作为名为stack的参数。没有对象被复制,也不是全局对象。你可以命名你的参数有些不同,但它仍然会引用同一个对象。

无论您通过reverse函数都将被使用。这不是全球性的,你可以控制使用哪个对象。

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

编辑:返工的措辞与所使用的术语更加一致。

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

+0

你有很多类似的术语,'variable','parameter','reference',但是你使用它们的方式很不一致,即使是不正确的。 –

+0

请详细说明您的评论。我更新了我的答案,使其更清晰并与条款更一致,但我无法找到任何我错误地使用这些术语的要点。 – GPhilo

+1

对我来说,一个问题是'stack'不是一个变量,而是一个参数。现在你正在与范围做区分,好得多。你也说过对参数进行操作会修改原来的变量,这很让人困惑。在某些方面,Python没有变量。名称引用对象。您可以更改名称以引用不同的对象,也可以修改该对象。所以我喜欢你现在说它修改参数引用的对象。 –