TIL. 27 재귀 호출(recursive call)
## 함수에서 재귀호출 사용하기
## 재귀호출 (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번의 반환으로 원하는 값을 반환할 수 있다.
