코딩테스트/자료구조

[6주차] 재귀함수

_JAEJAE_ 2021. 8. 26. 11:41

- 재귀함수 : 메소드 혹은 함수의 내부에서 자기 자신의 메소드 혹은 함수를 다시 호출하는 함수

                재귀함수 사용시 조건문을 활용하여 재귀함수 종료조건을 삽입해줘야 함

 

<예시문제> data = [3, 5, 8]의 성분들의 합으로 표현할 수 있는 숫자의 경우의 수는? 

2^3이라고 생각할 수 있지만 중복된 값이 있음 (0, 3, 5, 8, 8, 11, 13, 16 → 중복된 값 8)

 

data = [3, 5, 8]

result = set()

for i in range(2):
    for j in range(2):
        for k in range(2):
            result.add(data[0]*i + data[1]*j + data[2]*k)
print(result)  ---> {0, 3, 5, 8, 11, 13, 16}

완전 탐색으로 구현할 경우 답은 잘 나오지만 만약 리스트에 담긴 데이터의 수가 많아진다면 반복문의 개수 너무 많아진다! (성분의 개수 = 반복문의 개수) → 재귀함수 사용해야 한다.

 

- 재귀함수 사용 이유 : 코드의 간결화 및 변수 사용 최소화

 

def recur(index, value):
	if index == len(data):                   # 재귀함수 종료 구문
    	result.add(value)
    else:                                        # 재귀함수 본문
    	recur(index+1, value + data[index])  
        recur(index+1, value)

data = [3, 5, 8]
result = set()
recur(0, 0)
print(result)

 

<팩토리얼>

def factorial(n):
	if n == 1:
    	return 1
    else:
    	return n * factorial(n-1)
        
print(factorial(5))    ----------> 120

 

<피보나치 수열> : 두 수의 합이 다음 수가 되는 수열

1, 1, 2, 3, 5, 8, ...... 

def fibonacci(n):
	if n == 0 or n == 1:
    	return 1
    else:
    	return fibonacci(n-1) + fibonacci(n-2)

 

- 재귀함수 깊이 : 파이썬의 defualt 최대 깊이는 1000