본문 바로가기

python

python - 재귀 함수

재귀
함수는 자기 자신을 호출할 수 있습니다. 함수가 자신을 직점 또는 간접적으로 호출하는 것을 재귀(recursion)이라고 합니다. 재귀를 사용하면 while문이나 for문 없이도 반복작업을수행할 수 있습니다. 다음은 전형적인 재귀 함수입니다.

 

def numbers(n,m):
   """수 n을 출력하고, 1 더한 수가 m보다 작으면 그 수도 출력한다."""
   print(n)
   if n + 1 < m:
      numbers(n + 1, m)

numbers(4,8)
 > 4
 > 5 
 > 6
 > 7

 

코드의 함수는 자연수 n과 m을 입력받아 그 사이의 모든 자연수를 출력하는 함수입니다. 이 함수는 본문 안에서 자기자신( numbers() )을 호출합니다. 이 함수가 실행되는 과정을 살펴보면 다음과 같습니다. 
 1. 처음에 numbers(4,8)을 호출. 화면에 4가 출력된다. 4 + 1 < 5 는 참이므로 numbers(4 + 1, 8)이 재귀 호출된다. 
 2. 다시 호출될 numbers() 함수는 전달받은 n을 출력하고 조건을 검사해 numbers(n + 1, m)을 다시 호출한다. 
 3. numbers() 함수는 계속 동일한 형태로 호출되지만 이 함수의 매개변수 n에 전달되는 값은 계속 변한다. n + 1 < m 이라는 조건이 거짓이 된 호출에서 재귀호출은 더 이상 일어나지 않는다. 

이처럼 재귀함수는 while문이나 for문과 형태는 다르지만 반복의 시작, 각 주기의 변화 반복의 유지조건(종료조건)이 있습니다. 재귀는 어렵다는 편견이 있지만 언제 자기 자신을 호출할 것인지 어떤 값을 변화시켜 매개변수로 전달할 것인지에 잘 신경쓰면 그리 어렵지 않습니다. 

재귀의 단점
재귀는 특정한 문제를 해결할 때 편리하지만 단점도 있습니다. 재귀는 함수의 실행이 끝나기도 전에 또 다시 함수를 실행하기 때문에 재귀 호출이 연달아 많이 일어나면 컴퓨터의 계산 자원과 기억 자원을 빠르게 소모할 수 있습니다. 

프로그래밍 언어마다 문화의 차이가 있다고 합니다. 몇몇 프로그래밍 언어 while문이나 for문 같은 특별한 반복 기능보다는 재귀를 활용해 반복적인 문제를 해결하는 것을 권장하며 재귀의 한계를 개선가지 위한 기능을 제공하기도 합니다. 그러나 파이썬을 포함한 대부분의 프로그래밍 언어에서는 재귀보다 while문이다 for 문을 활용하는 것이 권장 됩니다.