def factorial(n):
if (n == 1): #종료조건
return 1
return n * factorial(n - 1) #자기 자신 호출
가장 대표적인 재귀함수를 이용한 예시는 팩토리얼이다.
사실 재귀는 반복문과 같은 역할을 하는 것이 아닌가? 왜 단순한 반복문이 아닌 복잡한 생각을 거치는 재귀함수를 사용하는 것일까?
라는 생각이 저는 들었습니다.(다른 분들은 어떨지 모르지만!)
그래서 찾아보게되었습니다.
재귀에 대해 조사하다가 발견하게 된 내용입니다.
재귀함수의 문제점 중 1개가 메모리를 많이 차지하는 것이었는데 꼬리 재귀가 이를 해결할 수 있다고 합니다.
# 재귀 버전
def factorial(n):
if (n == 1):
return 1
return n * factorial(n - 1)
# 꼬리 재귀 버전
def tail_factorial(n , total):
if n == 1:
return 1
return tail_factorial(n - 1, n * total)
정확하게 이해는 못했지만 이해한대로 얘기해보자면 꼬리 재귀는 return 부분에 연산이 없어야하는 것 같습니다.
이렇게 구현할 경우 컴파일러가 꼬리 재귀 최적화를 지원하여 재귀함수를 해석해서 반복문으로 변경해서 실행하기 때문에 스택 오버 플로우를 해결할 수 있다고 합니다.
자세한 내용은 더 공부를 하고 깨달으면 적도록 하겠습니다.