2017-03-07 1 views
0

파이썬에서 재귀를 사용하는 것에 대한 개념상의 의심이 있습니다. 아래 그림은 this page at geeksforgeeks에서 복사 한 재귀 만 사용하여 스택을 되돌리기위한 파이썬 코드입니다.파이썬에서의 재귀

# 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

pushpopstack이라는 이름의 개체를 수정합니다. 어디에서든 stack은 이라는 매개 변수로 reverseinsertAtBottom으로 전달되므로 동일한 개체의 이름입니다. 복사 된 개체는 없으며 전역 개체도 아닙니다. 매개 변수의 이름을 다르게 지정할 수도 있지만 여전히 동일한 개체를 참조합니다.

reverse 함수에 전달한 함수가 사용됩니다. 전역이 아니기 때문에 어떤 개체가 사용되는지 제어 할 수 있습니다.

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

편집 다음 말씨를 재 작업하는 데 사용되는 용어와 일관성을합니다.

stack은 전역 변수가 아니며 함수의 매개 변수입니다. 함수를 호출하기 전에 다른 곳에서 만들어진 스택 객체 인스턴스에 대한 참조로 상상할 수 있습니다. 매개 변수에서 작동하면 실제로 매개 변수에서 참조하는 개체가 수정됩니다.

+0

비슷한 용어 인'variable','parameter','reference'를 많이 사용하지만, 여러분은 그것들을 아주 일관성없이, 심지어 잘못 사용하고 있습니다. –

+0

귀하의 의견을 정교하게 기재하십시오. 내 대답을 업데이트하여 용어를보다 명확하고 일관성있게 만들었지 만 용어를 잘못 사용하는 부분을 찾을 수 없습니다. – GPhilo

+1

저에게있어 하나의 문제는'stack'은 변수가 아니라 매개 변수라는 것입니다. 이제 범위를 훨씬 더 잘 구분할 수 있습니다. 또한 매개 변수를 조작하면 원래 변수가 수정되므로 혼란 스럽습니다. 어떤면에서는 파이썬에는 변수가 없습니다. 이름은 객체를 참조합니다. 이름을 변경하여 다른 객체를 참조하거나 객체를 수정할 수 있습니다. 그래서 저는 여러분이 이제 매개 변수가 참조하는 객체를 수정한다고 말합니다. –