재귀 호출(recursion)은 함수가 자기 자신을 다시 호출하는 기법을 말한다. 재귀 호출을 사용하면 복잡한 문제를 간단하고 우아하게 풀 수 있지만, 잘못 사용하면 프로그램의 성능에 문제가 발생할 수 있다.
무한재귀 : 재귀 함수의 기본 케이스가 없거나 잘못되면 함수는 무한히 자신을 호출하게 됩니다. 이렇게 되면 프로그램은 결국 스택 오버플로우 에러를 발생시기케 된다
스택오버플로우(Stack Overflow) : 용량 제한으로 더 이상 원소를 추가하지 못할 때 발생한다
성능 : 모든 재귀 호출은 호출 스택에 저장된다. 따라서 많은 재귀 호출이 발생하면 메모리 사용량이 증가하게 된다.
가독성 : 일부 사람들에게는 재귀 코드가 복잡하게 느껴질 수 있다.
🖥️예제
def factorial(num):
if num > 1:
return num * factorial(num - 1)
else:
return num
factorial(4)
print(factorial(1))
print(factorial(2))
print(factorial(3))
print(factorial(4))
def palindrome(string):
if len(string) <= 1:
return True
if string[0] == string[-1]:
return palindrome(string[1:-1])
else:
return False
print(palindrome('역삼역'))
print(palindrome('배고파'))
정수 n을 입력받아 아래와 같이 처리하는 프로그램을 만들어보자.
def calculation(num):
num = int(num)
print(num) #num을 출력
if num == 1:
return print('끝') #만약에 num이 1이라면 '끝'을 출력하고 탈출
if num % 2 == 1: # num이 홀수라면 3*num+1을 하고
return calculation(3 * num + 1)
else: # 짝수라면 num / 2로 계산해라
return calculation(num / 2)
calculation(input('숫자를 입력하세요 '))