인프런 커뮤니티 질문&답변

wndud님의 프로필 이미지
wndud

작성한 질문수

파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)

11. 등산 경로(DFS)

[질문] 재귀함수 return 차이

작성

·

4.4K

0

[질문1]

먼저, dfs에서 스택에 넣다가 return을 만나면 이전 호출문으로 되돌아 간다고 생각을 하고 있었는데,

재귀함수에 return이 없는 경우에는 어떻게 종료지점을 알고 스택에서 이전 호출문 위치로 되돌아 가는지 궁금합니다.

[질문 2]

아래 2개 재귀함수가 각각 값이 6, None이 나오는데

그 이유를 알려주시면 감사하겠습니다.

1.

def max_int(a,b):

    if a%b == 0 :

        return b      # <== 여기서 6을 출력하게 됨.

    else: 

        return max_int(b,a%b)

print(max_int(192,162))

## 실행결과 : 6

2.

def max_int(a,b):

    if a%b == 0 :

        return b       # <== 여기서 None을 출력하게 됨.

    else: 

        max_int(b,a%b)

print(max_int(192,162))

## 실행결과 : 6

[위에 2개 함수 출력 화면]

감사합니다.^^

답변 1

1

답변 드리겠습니다. 질문을 보니 return의 정확한 기능이랑 사용법에 대해 잘 모르시는 것 것 같아 그것부터 말씀 드려야 이해하실 것 같습니다. 

def test(a, b):
    return a + b

def test2(a, b):
    a + b

c = test(1, 2)
print(c)  # 3

d = test2(2,3)
print(d)   # None

보시다시피 리턴문이 없으면 함수는 제일 마지막 줄에서 끝이 나게 됩니다. 리턴문으로 인해 해당 함수를 실행한 결과를 반환하고 함수 실행이 종료 되는데, 리턴문이 없으면 결과를 반환하지 못한 채 함수가 종료되기 때문에 해당 함수는 아무것도 없는 빈 값인 None이 찍히게 되는 겁니다. 

그렇다면 질문하신 코드로 돌아가봅시다. 192, 162를 넣으면 else문으로 빠지겟지요 else에 있는 재귀함수를 계속 타다 보면 12, 6이 되어 if 문을 만나고 재귀를 탈출할겁니다. 12, 6일때 재귀가 끝났으니 재귀스택 상단에 있는 함수부터 진행하다 말았던 리턴으로 돌아오겠지요. 12, 6의 결과는 6이니 30, 12의 결과는 6이고 스택으로 빠져나오는 함수의 리턴값은 전부 6이니 192, 162의 리턴값도 6을 반환하게 되는 겁니다. 

192 162 ? => 함수 162 30 리턴 => 함수 30 12 리턴 => 함수 12 6은 6 리턴 "따라서 6 리턴해" 이렇게 되는 겁니다. 

하지만 리턴문이 없다면..... 12 6이 6을 리턴한 이후 30 12로 돌아오게 되고 해당 케이스부터는 리턴문이 없으니 돌아오고 난 뒤부터 함수가 그대로 종료됩니다. 

192 162(None) ? => 함수 162 30 (None) => 함수 30 12(None) => 함수 12 6의 결과값 6 리턴

결과적으로 리턴문의 역할은 해당 함수의 결과값을 보여주기 위해 필요한 것이고 리턴을 만나는 즉시 함수는 "종료" 됩니다. 리턴문이 없으면 어디서 함수가 종료될지 알고 끊어지는 것이 아니라 함수가 끝까지 갔기 때문에 종료된 것이라 이해하시면 될 것 같습니다.

wndud님의 프로필 이미지
wndud

작성한 질문수

질문하기