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