- 자기 자신을 다시 호출하는 함수
def recursive():
print("재귀함수")
recursive()
recursive()
단 파이썬의 경우 메모리 제한이 있어서 아무제약조건 없이 재귀함수를 무한으로 돌릴수는 없다.
<재귀 함수의 종료 조건>
- 재귀 함수의 종료 조건을 반드시 명시해야 한다.
- 종료 조건을 명시하지 않으면 무한히 호출할 수 있다.
def recursive(i):
if i == 100:
return
print("재귀함수")
recursive(i+1)
recursive(1)
return 처럼 종료 조건 명시를 해야한다.
<재귀 함수의 예시>
1. 팩토리얼 < 1 * 2 * 3 * ...* (n-1) * n >
1.1 반복문으로 팩토리얼 구현
def factorial(n):
result = 1
for i in range(1, n+1):
result *= i
return result
1.2 재귀적으로 팩토리얼 구현
def factorial(n):
if n <= 1:
return 1
return n * factorial(n-1)
<2. 유클리드 호제법 (최대공약수 계산)>
여기서 GCD는 최대공약수를 의미하는 것이다. 즉, 192와 162 두 수의 최대공약수를 구하는 것이다.
- 192(A)와 162(B)를 나눈 나머지 30(R)을 구할 수 있다.
- 다시 162(A)와 30(B)을 나눈 나머지 12(R)을 구할 수 있다.
- 다시 30(A)과 12(B)를 나눈 나머지 6(R)을 구할 수 있다.
- 결론적으로 12와 6이 남게 된다.
- 192와 162의 최대공약수가 12와 6의 최대공약수라고 알 수 있다.
- 6은 12의 배수이므로 192와 162의 최대공약수는 6이란걸 알 수 있다!
<유클리드 호제법 예제>
- 두 자연수 A, B에 대하여 (A > B) A를 B로 나눈 나머지를 R이라고 한다.
- A와 B의 최대공약수는 B와 R의 최대공약수와 같다.
def gcd(a,b):
if a % b == 0:
return b
else:
return gcd(b, a % b)
print(gcd(192,162))
* a가 b의 배수이면 b를 반환한다.
<재귀 함수 사용의 유의 사항>
- 재귀 함수를 활용시 복잡한 알고리즘을 간결하게 작성할 수 있다.
- 반복문을 이용하여 동일한 기능을 구현가능
- 무조건 반복문보다 유리한 것은 아니다.
- 함수를 연속적으로 호출하면 메모리 내부의 스택 프레임에 쌓인다.
'CodingTest > DFS & BFS' 카테고리의 다른 글
미로 탈출 (0) | 2022.07.07 |
---|---|
음료수 얼려 먹기 (0) | 2022.07.07 |
BFS (Breadth-First Search) (0) | 2022.07.07 |
DFS (Depth-First Search) (0) | 2022.07.07 |
DFS/BFS 이론 (큐&스택) (0) | 2022.07.07 |