2017-03-07 92 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沒有變量。名稱引用對象。您可以更改名稱以引用不同的對象,也可以修改該對象。所以我喜歡你現在說它修改參數引用的對象。 –