재귀호출이란?
재귀호출의 예시
def hello():
print('Hello, world!')
hello()
return
hello()
# hello 함수를 실행 : Hello, world!
Hello, world!
Hello, world!
.
.
.
RecursionError: maximum recursion depth exceeded while calling a Python object
위 예시에서 hello
함수는 함수 내부에서 hello()
라는 코드를 통해 자기 자신을 호출하고 있다. hello
함수가 실행될 때마다, 같은 함수(자기 자신)가 호출되는 것이다. 이러한 함수의 반복 호출은 print()
를 통해 출력되는 문자열을 통해서도 확인 가능하다. 함수가 실행되면, print('Hello, world!')
명령이 반복되면서 문자열이 반복 출력된다.
문자열의 반복 출력이 도중에 멈춘 뒤 error가 발생하는 이유는 파이썬의 최대 재귀 깊이(maximum recursion depth)가 1,000으로 정해져 있기 때문이다.
재귀호출의 종료 조건 만들기
그렇다면, 재귀호출의 error 발생을 막을 순 없을까? 방법은 의외로 간단하다. 함수의 반복 호출을 종료시킬 수 있는 조건을 만들어 코드의 흐름을 제어하는 것이다.
def hello(count): # 함수의 호출 횟수를 인수로 받는 매개변수 count를 추가
if count == 0: # 변수 count의 값이 0일 경우에 대한 조건을 설정
return # return을 통해 함수를 빠져나가게 되면서 재귀 호출이 종료된다.
print('Hello, world!')
count -= 1 # 함수의 호출이 1회 이뤄질 때마다 변수 count의 값에 변화를 주는 변화식 추가
hello(count)
hello(5)
위 함수를 실행할 경우, print(Hello, world!)
가 5회 실행됨에 따라 문자열 'Hello, word!'가 5회 출력된 후, return
에 의해 함수 실행이 종료된다.
재귀호출로 팩토리얼 구하기
재귀호출을 응용하여 팩토리얼을 구현할 수 있다. 팩토리얼의 정의는 아래 설명을 참고하도록 하자.
팩토리얼은 1부터 n까지 양의 정수를 차례대로 곱한 값이며 !(느낌표) 기호로 표기합니다. 예를 들어 5!은 5 * 4 * 3 * 2 * 1이며 결과는 120입니다.
재귀호출로 구현한 팩토리얼은 살펴보자.
def factorial(count):
if count == 1:
return 1 # count가 1인 경우, 결괏값으로 1을 반환
return count*factorial(count-1) # 인수로 받은 변수 count의 값 * factorial(count-1)의 결괏값
print(factorial(5)) # 결괏값 출력을 위해 print() 사용
# 결괏값 : 120
개인적인 단상을 정리하면
함수의 결괏값은 return
을 통해 반환된 값이다.
return
으로 함수 객체(factorial(count-1))를 반환할 수도 있다. 이러한 경우, 함수 객체가 호출(실행)된다.