210 likes | 859 Vues
2 장 . 재귀 (recursion) 1 절 . 재귀함수의 개념 2 절 . 팩토리얼함수 3 절 . 피보나치 수열 4 절 . 하노이 탑. 이 완 직 ( wjlee@pnu.ac.kr ) 2010 년 1 학기. 1. 재귀함수 개념. 재귀함수 (Recursive Function) 함수 내부에서 자신의 함수를 다시 호출하는 함수 이러한 호출을 재귀호출 (recursive call) 이라 함 재귀호출의 사례
E N D
2장. 재귀(recursion)1절. 재귀함수의 개념 2절. 팩토리얼함수 3절. 피보나치 수열 4절. 하노이 탑 이 완 직 (wjlee@pnu.ac.kr) 2010년 1학기
1. 재귀함수 개념 • 재귀함수 (Recursive Function) • 함수 내부에서 자신의 함수를 다시 호출하는 함수 • 이러한 호출을 재귀호출(recursive call)이라 함 • 재귀호출의 사례 • 팩토리얼, 피보나치수열, 이항계수, 하노이의 탑, 이진 탐색 등
2. 팩토리얼함수 • 팩토리얼(Factorial) 예 • 5! = 5 * 4 * 3 * 2 * 1 • 팩토리얼을 일반화하여 하나의 공식으로 표현할 수 있고,1이 나올 때까지 1씩 감소해가며 곱해서 누적하여 구해진다.
2.1 재귀함수 구현 • [예제 2-1] 팩토리얼을 구하는 재귀함수
2.1 재귀함수 구현 • 재귀함수 동작원리
2.1 재귀함수 구현 • 팩토리얼 재귀함수의 호출 순서 • [개념 다지기 2-1] 직접풀어 볼 것.
2.2 재귀함수와 스택 • 재귀함수 장점: • 복잡한 프로그램을 간결하게 작성할 수 있다. • 가독성이 높다. (?) • 재귀함수의 단점 • 메모리 소비가 높다. • 함수 내부에서 사용되었던 변수(스택) • 변수에 할당된 메모리 해제 이전에 (자신의) 함수를 다시 호출한다. 따라서 새로운 함수의 변수를 위해 메모리 할당이 다시 수행 • 시스템(운영체제)의 함수 리턴 주소 저장(스택) • 재귀호출은 함수 리턴 이전에 새 함수를 연속적으로 호출함으로 리턴할 주소를 기억하는 운영체제 영역의 스택도 소비됨
2.2 재귀함수와 스택 • [예제 2-2] 재귀함수와 스택 • 교재 [그림 2-11] 참조 (매개 변수를 위한 스택 소모)
2.3 재귀 함수의 성능 • [예제 2-3] 개념 다지기 2-2의누적 합 구하기의 반복문 구현
2.3 재귀 함수의 성능 • [예제 2-4] 팩토리얼 구하기 반복문 구현
2.3 재귀 함수의 성능 • 재귀함수 .vs. 반복문 • 성능 (수행시간) • 재귀함수는 동일한 함수가 여러 번 호출됨에 따라, 함수 호출 시점에 복귀 주소 저장(스택), 호출 종료 시 복귀주소로 리턴을 반복 • 따라서 수행 시간이라는 성능 측면에서도 반복문이 우수 • 재귀함수 사용 이유 • 간결하게 프로그램을 작성할 수 있음 • 특정 문제는 재귀함수로만 구현 가능 (트리 순회 알고리즘) A B C D E F G H I J
3. 피보나치 수열 • 제1항과 제2항을 1이라 하고, 제3항부터는 차례로 앞의 두 항의 합을 취하는 수열을 말한다. • fib(n)를 구하기 위해서는 • fib(n-1)와 fib(n-2)를 알아야 하므로 재귀적인 호출이 두 번 일어나야 한다.
3. 피보나치 수열 • [예제 2-5] 피보나치 수열을 재귀함수로 구현
3. 피보나치 수열 • [예제 2-6] 피보나치 수열 반복문으로 구현
4. 하노이 탑 • 하노이의 탑(Tower of Hanoi)의 규칙 • a, b, c라는 세 개의 봉이 있다. • a의 봉에 도넛형 원반이 n장 끼워져 있다. • (위쪽 직경이 짧다) • 이 원반을 모두 c의 봉으로 옮긴다. • 단 원반은 한 번에 한 장씩만 이동한다. • 큰 원반을 작은 원반 위에 올려놓아서는 안 된다.
시작봉(a)에서 2의 원반을 작업봉(b)으로 이동한다. (중간 원반을 이동) 4. 하노이 탑 • 시작봉(a)에서 1의 원반을 목적봉(c)으로 이동한다. (작은 원반을 이동)
목적봉(c)에서 1의 원반을 작업봉(b)으로 이동한다. (작은 원반을 중간 원반 위에 올려놓음) 4. 하노이 탑 • 시작봉(a)에서 3의 원반을 목적봉(c)으로 이동한다. (큰 원반을 이동)
작업봉(b)에서 1의 원반을 시작봉(a)으로 이동한다. (작은 원반을 이동) 4. 하노이 탑 • 작업봉(b)에서 2의 원반을 목적봉(c)으로 이동한다. (중간 원반을 이동)
시작봉(a)에서 1의 원반을 목적봉(c)으로 이동한다. (작은 원반을 이동) 4. 하노이 탑 • 일반화하여 n개의 원반을 이동하는 방법을 정리해보자. ❶ 시작봉(a)의 원반 n-1개를 작업봉(b)으로 옮긴다. (장애물을 제거한 뒤) ❷ 시작봉(a)의 원반 n을 목적봉(c)으로 옮긴다. ❸ 작업봉(b)의 원반 n-1을 목적봉(c)으로 옮긴다. (장애물을 되돌려놓는다)
4. 하노이 탑 • [예제 2-7] 하노이 탑 프로그램