TIL

TIL. 27 재귀 호출(recursive call)

codermun 2020. 11. 4. 13:19
728x90
반응형

## 함수에서 재귀호출 사용하기

## 재귀호출 (recursive call) : 함수 안에서 자기자신을 호출하는 방식을 재귀호출이라 한다.

## 일반적인 상황에서는 사용되지 않지만 알고리즘을 구현할때 매우 유용하다 (구현 == 만들다와 같은 뜻)

## 보통 알고리즘에 따라서 반복문으로 구현한 코드보다 좀 더 직관적이고 이해하기 쉬운 경우가 많다.

def helllo():
    print('hello mun')
    helllo()

helllo()

## helllo 함수 안에서 자기 자신을 호출하고 있는 상황이다.

## 무한루프 처럼 작동하다가 어느 순간 error가 발생하는데

## 이유는 파이썬에서는 최대 재귀 깊이(maximum recursion depth)가 1,000 으로 정해져있기 때문이다.

## 즉, hello 함수가 자기 자신을 계속 호출하다가 최대 재귀 깊이를 초과하기 때문에 error 가 발생한다.

이러한 현상을 재귀호출의 스택 넘침 현상이라 한다.

 


## 재귀 호출을 사용할 경우 반드시 종료 조건을 만들어 주어야 한다.

def hello(count):

    if count == 0 :   # 종료 조건, count 가 0이면 hello 함수를 호출 하지 않고 끝냄.

        return

    print('hello, hello', count)

    count -= 1

    hello(count)



hello(5)

# hello, hello 5

# hello, hello 4

# hello, hello 3

# hello, hello 2

# hello, hello 1

 

## 여기서 종료 조건인 

## if count = 0:

##    return     // count 가 0이면 return  되돌아 가세요 라는 의미인데, 

       if문 이 참이되어 아래 print가 실행되지 않고 함수가 종료된다.

## hello (5) 로 hello 함수를 총 6번 루프가 돌아가며 print는 5번 실행된다.1 => 52 => 43 => 34 => 25 => 16 => return으로 종료


## 재귀호출로 팩토리얼 구하기

def factorial(n):
    if n == 1:
        return 1
    return(n * factorial(n-1))     #return 위치 주의

print(factorial(5))
::
120

5! = 5 x 4 x 3 x 2 x 1 이다.

### 여기서 마지막 1! 값if 조건문의 반환 값 1로써, 함수를 중단시키는 조건이자 마지막 1!의 값을 준다.


## 위 함수를 호출 및 반환하는 과정이다.

 

## 총 5번의 호출과 5번의 반환으로 원하는 값을 반환할 수 있다.

728x90
반응형