2014-06-05 5 views
0
def counter(n): 
    if n < 0: 
     return 
    else: 
     print '1st print', n 
     counter(n-1) 
     print '2nd print', n 

print counter(3) 

# 1st print 3 
# 1st print 2 
# 1st print 1 
# 1st print 0 
# 2nd print 0 
# 2nd print 1 
# 2nd print 2 
# 2nd print 3 
# None 

그래서 재귀 함수를 둘러 보면서 아주 특이한 것을 깨달았습니다. 주위에 머리를 감쌀 수 없었습니다. 3에서 0으로 인쇄하는 함수의 첫 번째 부분은 이해하지만 두 번째 부분은 0에서 3으로 다시 인쇄 할 때 이해할 수 없습니다. n = 0 일 때 함수가 멈추지 않을까요?파이썬 : 재귀

+3

재귀 전에 한 번, * 후에 * 한번 두 번'n '을 인쇄합니다. 모든 재귀 호출이 완료되면 재귀 호출을 대기하는 모든 메소드가 'n'을 다시 인쇄합니다 (반대 순서로). 펜과 종이로 직접 실행 해보십시오. –

+0

이것은 파이썬입니다. 코드를 작성하려고하면 모든 것을 망칠 수 있습니다. 방금 편집했습니다. –

+1

@AbdulFatir 들여 쓰기 수정 해 주셔서 감사합니다. 그러나 Commonwealth English ("실현 됨")는 완벽하게 수용 할 수 있으므로 편집해서는 안됩니다. – chrylis

답변

8

재귀 호출은 여전히 ​​호출 한 부모 함수로 돌아갑니다. 범위에서n은 변경되지 않았습니다.

함수 로컬은 함수 자체를 계속 호출하더라도 현재 프레임에 국한됩니다.

귀하의 재귀 호출은 다음과 같습니다

counter(3): 
    n = 3 
    | 
    | counter(n - 1) 
    | n = 2 
    | | 
    | | counter(n - 1) 
    | | n = 1 
    | | | 
    | | | counter(n - 1) 
    | | | n = 0 
    | | | | 
    | | | return 
    | | | 
    | | n is still 1 here 
    | | return 
    | | 
    | n is still 2 here 
    | return 
    | 
    n is still 3 here 
    return 
+1

+1. –

+0

니스, 250k :-)에 도달 한 것을 축하합니다. (음, 거의) –

+0

@TimCastelijns : 내일, 확실합니다. 그리고 나서. :-P 고마워! –

1

예, 기능이 정지 것 - 마지막 수준. 그러나 상위 레벨은 여전히 ​​두 번째 출력을 처리합니다.

예를 들어 설명해 드리겠습니다. 당신은 건물의 N 층에 살고 지상층으로 가서 다시 돌아가고 싶습니다. 건물은 엘리베이터를 가지고 있지 않기 때문에, 당신은 알고리즘을 수행하기로 결정 : 당신이 층에 들어가면

def godown(n): 
    if n <= 0: # already there 
     print "At the ground level" 
     return 
    print "Going down" 
    godown(n-1) # we moved one floor lower 
    print "Going back up" 

, 당신은 갑자기 당신이 다시 가고 싶어 잊지 않을 것입니다. 당신은 그것을 알고 있습니다. 그리고 비록 당신이 1 층 (종결 상태 임)에 있더라도, 당신은 다시 돌아갑니다. 그것은 컴퓨터와 동일합니다. 모든 기능을 함께 종료하지 않고 이전 호출의 모든 명령 실행을 완료합니다. 다른 함수 호출과 마찬가지로 작동합니다.

def bar(): 
    print "inBar" 
    return 

def foo(): 
    print "preBar" 
    bar() 
    print "postBar" 
1

코드를 약간 단순화했지만 본질적으로 동일합니다. 내 대답은 첫 번째 사람의 대답과 비슷하지만 그의 대답을 이해하지 못했습니다. 나는 이것을 이것으로 바꾸었다.

def counter(n): 
    if n == 0: 
     return 
    else: 
     print ("Hi") 
     counter(n-1) 

     print("Hi again!") 

counter(3) 

재귀는 이미 실행중인 함수를 호출하는 것을 의미합니다. 따라서 counter(n-1)을 수행하면 다른 카운터 기능이 만들어집니다. 현재 2 개의 카운터가 실행 중입니다. 원래 하나는 두 번째 작업이 완료 될 때까지 중단됩니다.

def counter(n): #N is 3 here! 
    if n == 0: 
     return 
    else: 
     print ("Hi") 
     counter(n-1) ---------> (NEW FUNCTION) def counter(2): 
                print("Hi") 
                counter (n-1) ---------> (NEW FUNCTION)def counter(1): 
                           print("Hi") 
                           counter(n - 1) ---------> NEW FUNCTION def counter(0) 
                                      #function returns and ends 
                                      | 
                           (program still running)      | 
                                      | 
                           print ("Hi again")    <------------- 
                             | 
               (program still running)   <--------------------|    

               print("Hi again") 
                 | 
(program still running)     <------------| 

    print("Hi again!")