2 장 . 재귀 (recursion) 1 절 . 재귀함수의 개념 2 절 . 팩토리얼함수 3 절 . ...

20
이 이 이 ([email protected] ) 2010 이 1 이이 2 장 . 장장 (recursion) 1 장 . 장장장장장 장장 2 장 . 장장장장장장 3 장 . 장장장장 장장 4 장 . 장장장 장

description

2 장 . 재귀 (recursion) 1 절 . 재귀함수의 개념 2 절 . 팩토리얼함수 3 절 . 피보나치 수열 4 절 . 하노이 탑. 이 완 직 ( [email protected] ) 2010 년 1 학기. 1. 재귀함수 개념. 재귀함수 (Recursive Function) 함수 내부에서 자신의 함수를 다시 호출하는 함수 이러한 호출을 재귀호출 (recursive call) 이라 함 재귀호출의 사례 - PowerPoint PPT Presentation

Transcript of 2 장 . 재귀 (recursion) 1 절 . 재귀함수의 개념 2 절 . 팩토리얼함수 3 절 . ...

Page 1: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

이 완 직 ([email protected])2010 년 1 학기

2 장 . 재귀(recursion)

1 절 . 재귀함수의 개념2 절 . 팩토리얼함수3 절 . 피보나치 수열4 절 . 하노이 탑

Page 2: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

• 재귀함수 (Recursive Function)– 함수 내부에서 자신의 함수를 다시 호출하는 함수– 이러한 호출을 재귀호출 (recursive call) 이라 함

• 재귀호출의 사례– 팩토리얼 , 피보나치수열 , 이항계수 , 하노이의 탑 , 이진 탐색

1. 재귀함수 개념

2

Page 3: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

• 팩토리얼 (Factorial) 예– 5! = 5 * 4 * 3 * 2 * 1

• 팩토리얼을 일반화하여 하나의 공식으로 표현할 수 있고 ,1 이 나올 때까지 1 씩 감소해가며 곱해서 누적하여 구해진다 .

2. 팩토리얼함수

3

Page 4: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

• [ 예제 2-1] 팩토리얼을 구하는 재귀함수

2.1 재귀함수 구현

4

Page 5: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

• 재귀함수 동작원리

2.1 재귀함수 구현

5

Page 6: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

• 팩토리얼 재귀함수의 호출 순서

2.1 재귀함수 구현

6

• [ 개념 다지기 2-1] 직접 풀어 볼 것 .

Page 7: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

• 재귀함수 장점 :– 복잡한 프로그램을 간결하게 작성할 수 있다 .– 가독성이 높다 . (?)

• 재귀함수의 단점

– 메모리 소비가 높다 .• 함수 내부에서 사용되었던 변수 ( 스택 )

– 변수에 할당된 메모리 해제 이전에 ( 자신의 ) 함수를 다시 호출한다 . 따라서 새로운 함수의 변수를 위해 메모리 할당이 다시 수행

• 시스템 ( 운영체제 ) 의 함수 리턴 주소 저장 ( 스택 )– 재귀호출은 함수 리턴 이전에 새 함수를 연속적으로 호출함으로 리턴할

주소를 기억하는 운영체제 영역의 스택도 소비됨

2.2 재귀함수와 스택

7

Page 8: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

• [ 예제 2-2] 재귀함수와 스택

2.2 재귀함수와 스택

8

• 교재 [ 그림 2-11] 참조 ( 매개 변수를 위한 스택 소모 )

Page 9: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

• [ 예제 2-3] 개념 다지기 2-2 의 누적 합 구하기의 반복문 구현

2.3 재귀 함수의 성능

9

Page 10: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

• [ 예제 2-4] 팩토리얼 구하기 반복문 구현

2.3 재귀 함수의 성능

10

Page 11: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

• 재귀함수 .vs. 반복문– 성능 ( 수행시간 )

• 재귀함수는 동일한 함수가 여러 번 호출됨에 따라 , 함수 호출 시점에 복귀 주소 저장 ( 스택 ), 호출 종료 시 복귀주소로 리턴을 반복

• 따라서 수행 시간이라는 성능 측면에서도 반복문이 우수

• 재귀함수 사용 이유• 간결하게 프로그램을 작성할 수 있음• 특정 문제는 재귀함수로만 구현 가능 ( 트리 순회 알고리즘 )

2.3 재귀 함수의 성능

11

A

B C D

E F G H I J

Page 12: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

• 제 1 항과 제 2 항을 1 이라 하고 , 제 3 항부터는 차례로 앞의 두 항의 합을 취하는 수열을 말한다 .

3. 피보나치 수열

12

• fib(n) 를 구하기 위해서는- fib(n-1) 와 fib(n-2) 를 알아야 하므로 재귀적인 호출이 두 번

일어나야 한다 .

Page 13: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

• [ 예제 2-5] 피보나치 수열을 재귀함수로 구현

3. 피보나치 수열

13

Page 14: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

3. 피보나치 수열

14

• [ 예제 2-6] 피보나치 수열 반복문으로 구현

Page 15: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

• 하노이의 탑 (Tower of Hanoi) 의 규칙

– a, b, c 라는 세 개의 봉이 있다 .– a 의 봉에 도넛형 원반이 n 장 끼워져 있다 . – ( 위쪽 직경이 짧다 )– 이 원반을 모두 c 의 봉으로 옮긴다 .– 단 원반은 한 번에 한 장씩만 이동한다 .– 큰 원반을 작은 원반 위에 올려놓아서는 안 된다 .

4. 하노이 탑

15

Page 16: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

4. 하노이 탑

16

① 시작봉 (a) 에서 1 의 원반을 목적봉 (c) 으로 이동한다 . (작은 원반을 이동 )

② 시작봉 (a) 에서 2 의 원반을 작업봉 (b) 으로 이동한다 . ( 중간 원반을 이동 )

Page 17: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

4. 하노이 탑

17

③ 목적봉 (c) 에서 1 의 원반을 작업봉 (b) 으로 이동한다 . ( 작은 원반을 중간 원반 위에 올려놓음 )

④ 시작봉 (a) 에서 3 의 원반을 목적봉 (c) 으로 이동한다 . ( 큰 원반을 이동 )

Page 18: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

4. 하노이 탑

18

⑤ 작업봉 (b) 에서 1 의 원반을 시작봉 (a) 으로 이동한다 . ( 작은 원반을 이동 )

⑥ 작업봉 (b) 에서 2 의 원반을 목적봉 (c) 으로 이동한다 . ( 중간 원반을 이동 )

Page 19: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

4. 하노이 탑

19

⑦ 시작봉 (a) 에서 1 의 원반을 목적봉 (c) 으로 이동한다 . ( 작은 원반을 이동 )

• 일반화하여 n 개의 원반을 이동하는 방법을 정리해보자 .

❶ 시작봉 (a) 의 원반 n-1 개를 작업봉 (b) 으로 옮긴다 . ( 장애물을 제거한

뒤 )

❷ 시작봉 (a) 의 원반 n 을 목적봉 (c) 으로 옮긴다 .

❸ 작업봉 (b) 의 원반 n-1 을 목적봉 (c) 으로 옮긴다 . ( 장애물을

되돌려놓는다 )

Page 20: 2 장 .  재귀 (recursion) 1 절 .  재귀함수의 개념 2 절 .  팩토리얼함수 3 절 .  피보나치 수열 4 절 .  하노이 탑

4. 하노이 탑

20

• [ 예제 2-7] 하노이 탑 프로그램