PowerPoint 프레젠테이션

Similar documents
슬라이드 1

슬라이드 1

PowerPoint 프레젠테이션

chap x: G입력

PowerPoint 프레젠테이션

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

쉽게배우는알고리즘 8장. 동적프로그래밍 프로그래밍 Dynamic Programming (DP)

Microsoft PowerPoint - chap10-함수의활용.pptx

PowerPoint 프레젠테이션

C 프로그래밊 개요

Microsoft PowerPoint 알고리즘 개요(Part 1).pptx

설계란 무엇인가?

Data structure: Assignment 1 Seung-Hoon Na October 1, Assignment 1 Binary search 주어진 정렬된 입력 파일이 있다고 가정하자. 단, 파일내의 숫자는 공백으로 구 분, file내에 숫자들은

금오공대 컴퓨터공학전공 강의자료

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

쉽게 풀어쓴 C 프로그래밍

Visual Basic 반복문

Microsoft Word - FunctionCall

윈도우즈프로그래밍(1)

중간고사

쉽게 배우는 알고리즘 강의노트

chap 5: Trees

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음


0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

PowerPoint Presentation

11장 포인터

PowerPoint 프레젠테이션

2002년 2학기 자료구조

untitled

<FEFF E002D B E E FC816B CBDFC1B558B202E6559E830EB C28D9>

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Microsoft PowerPoint - chap11-포인터의활용.pptx

슬라이드 1

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Java ...

歯MW-1000AP_Manual_Kor_HJS.PDF

PowerPoint 프레젠테이션

제 3강 역함수의 미분과 로피탈의 정리

Microsoft PowerPoint - C++ 5 .pptx

쿠폰형_상품소개서

Microsoft PowerPoint - chap06-1Array.ppt

쉽게 풀어쓴 C 프로그래밍

WISHBONE System-on-Chip Interconnection Architecture for Portable IP Cores

제 11 장포인터 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - chap-11.pptx

목차 배열의개요 배열사용하기 다차원배열 배열을이용한문자열다루기 실무응용예제 C 2

Microsoft PowerPoint - chap-09.pptx

Microsoft PowerPoint - chap04-연산자.pptx

PowerPoint 프레젠테이션

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

C 언어 프로그래밊 과제 풀이

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - Chapter8.pptx

레프트21

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - chap06-5 [호환 모드]

슬라이드 1

쉽게 풀어쓴 C 프로그래밍

; struct point p[10] = {{1, 2, {5, -3, {-3, 5, {-6, -2, {2, 2, {-3, -3, {-9, 2, {7, 8, {-6, 4, {8, -5; for (i = 0; i < 10; i++){ if (p[i].x > 0 && p[i

Chap 6: Graphs

3장 함수

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft PowerPoint - chap05-제어문.pptx

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

OCW_C언어 기초

02장.배열과 클래스

2017 년 6 월한국소프트웨어감정평가학회논문지제 13 권제 1 호 Abstract

PowerPoint Presentation

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - chap-05.pptx

Microsoft PowerPoint - 알고리즘_5주차_1차시.pptx

Microsoft PowerPoint - java2-lab2-DirectoryImageConverter.pptx

03장.스택.key

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

슬라이드 1

Microsoft Word - ExecutionStack

17장 클래스와 메소드

슬라이드 1

Microsoft PowerPoint - ch07 - 포인터 pm0415


<4D F736F F F696E74202D20C1A639C0E520C7D4BCF6BFCDBAAFBCF6>

HW5 Exercise 1 (60pts) M interpreter with a simple type system M. M. M.., M (simple type system). M, M. M., M.

쉽게 풀어쓴 C 프로그래밍

03_queue

설계란 무엇인가?

컴파일러

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Infinity(∞) Strategy

C 프로그래밊 개요

원형연결리스트에대한설명중틀린것은 모든노드들이연결되어있다 마지막에삽입하기가간단한다 헤더노드를가질수있다 최종노드포인터가 NULL이다 리스트의 번째요소를가장빠르게찾을수있는구현방법은무엇인가 배열 단순연결리스트 원형연결리스트 이중연결리스트 단순연결리스트의노드포인터 가마지막노드를


Chapter 4. LISTS

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Microsoft PowerPoint - Chapter_08.pptx

-09- 학습목표 기본정렬알고리즘을이해한다. 정렬을귀납적관점에서볼수있도록한다. 1 장과 2 장에서배운기법을사용해각정렬의수행시간을분석할수있도록한다. 비교정렬의한계를이해하고, 선형시간정렬이가능한조건과선형시간정렬알고리즘을이해한다. - - 한빛미디어 Sortng Algorth

쉽게 풀어쓴 C 프로그래밍

Chapter 4. LISTS

JAVA PROGRAMMING 실습 02. 표준 입출력

Transcription:

대표적인분할정복알고리즘 4 장. 재귀호출 학습목표 재귀호출이라는개념자체를명확히이해한다. 재귀호출함수의내부구조를이해한다. 재귀호출에내재하는효율성에대해이해한다. 1

Section 01 상징적의미 - 도미노 도미노 2

도미노 100 번째것이반드시쓰러진다는사실을증명하라. 수학적귀납법 (Mathematical Induction) 처음것 (K=1) 은반드시쓰러진다. K 번째막대가쓰러지면 (K+1) 번째막대도반드시쓰러진다. 재귀적알고리즘 (Recursive Algorithm) 수학적귀납법의순서를역순으로적용 99 번째것이쓰러지면인접한 100 번째것이쓰러지니, 99 번째것이반드시쓰러진다는사실을증명하라. 98 번째것이쓰러지면인접한 99 번째것이쓰러지니, 98 번째것이반드시쓰러진다는사실을증명하라. 처음것이반드시쓰러진다는사실을증명하라. 그건직접밀었기때문에반드시쓰러진다. 3

재귀호출분할정복 문제의크기 N 큰문제를작은문제로환원작은문제역시큰문제와유사함 재귀호출 Self Call Boomerang 아주작은문제 직접해결할정도로작아짐 베이스케이스 ( 디제너릿케이스 ) 4

BinarySearch(SearchRange) Section 02 이진탐색 - 이진탐색 괄호안은탐색범위 { if (One Page) 베이스케이스 Scan Until Found; else { Unfold the Middle Page; 가운데펼침 Determine Which Half; 전반부, 후반부판단 if First Half BinarySearch(First Half); 전반부재귀호출 else BinarySearch(Second Half); 후반부재귀호출 문제크기감소 : N, N/2, N/4,., 1 재귀호출은반드시베이스케이스에도달해야함 5

Section 03 재귀적팩토리얼 팩토리얼연산 n! = n (n-1) (n-2)... 1 ( 단, 1! = 0! = 1) int Factorial(int n) { if (n = = 1) return 1; else return(n * Factorial(n-1)); [ 그림 4-3] 재귀호출의들어가기와나오기 6

int Factorial(int n) { if (n = = 1) return 1; else return(n * Factorial(n-1)); 활성화레코드 Stack Expands Parm. n = 4 Ret. Val =? Parm. n = 3 Ret. Val =? Parm. n = 2 Ret. Val =? Parm. n = 1 Ret. Val =? Parm. n = 4 Ret. Val = 4 * 6 Parm. n = 3 Ret. Val = 3 * 2 Parm. n = 2 Ret. Val = 2 * 1 Parm. n = 1 Ret. Val = 1 Stack Shrinks [ 그림 4-2] 재귀호출에따른활성화레코드 7

Section 04 문자열뒤집기 문자열뒤집기 I void Reverse(char S[ ], int Size) { if (Size = = 0) return; 호출함수로되돌아감 else { printf("%c", S[Size-1]); 마지막문자를쓰기 Reverse(S, Size-1); 재귀호출 마지막문자를먼저제거 문자열 PET 에대해서추적해보라. 8

void Reverse(char S[ ], int First, int Last) { if (First > Last) return; else { printf("%c", S[First]); Reverse(S, First+1, Last); 문자열뒤집기 II 첫문자를먼저제거 위코드는제대로돌지않음 어떻게고쳐야하는가 9

문자열뒤집기 II void Reverse(char S[ ], int First, int Last) { if (First > Last) return; else { printf("%c", S[First]); Reverse(S, First+1, Last); First = 0 Last = 3 Reverse(S, 1, 3) First = 1 Last = 3 Reverse(S, 2, 3) First = 2 Last = 3 Reverse(S, 3, 3) First = 3 Last = 3 Reverse(S, 4, 3) First = 4 Last = 3 First = 0 Last = 3 printf(s[0]) First = 1 Last = 3 printf(s[1]) First = 2 Last = 3 printf(s[2]) First = 3 Last = 3 printf(s[3]) First = 4 Fast = 3 return [ 그림 4-4] 문자열뒤집기의활성화레코드 10

Section 05 K번째작은수찾기 K 번째작은수찾기 10, 7, 2, 8, 3, 1, 9, 6 이라는숫자중에서세번째작은수는 3 재귀적방법론 10, 7, 2, 8 과 3, 1, 9, 6으로분할 10, 7, 2, 8 중세번째작은수는 8 3, 1, 9, 6 중세번째작은수는 6 작은문제의해결책이큰문제의해결책으로이어지지않는다. 11

파티션 1) 임의로피벗설정 2) 다운포인터와업포인터설정 3) 다운은피벗보다작거나같은것, 업은피벗보다크거나같은것찾음 4) 스와핑 10 7 2 8 3 1 9 6 10 7 2 8 3 1 9 6 10 7 2 8 3 1 9 6 1 7 2 8 3 10 9 6 5) 포인터가일치하거나교차할때까지 3),4) 를반복 1 7 2 8 3 10 9 6 1 3 2 8 7 10 9 6 1 3 2 8 7 10 9 6 6) 업포인터위치에있는숫자와피벗을스와핑 p 1 3 2 6 7 10 9 8 [ 그림 3-10] 가비지 12

파티션파티션 피벗보다작은것은왼쪽으로, 피벗보다큰것은오른쪽으로전체데이터가정렬된상태는아님모든데이터가정렬되어도피벗위치는불변 K가 4라면네번째작은수를이미찾은것임 p 1 3 2 6 7 10 9 8 세번째작은수찾기 분할된왼쪽에대해서다시파티션을가함 ( 결과 p = 2) 1 3 2 p 1 2 3 분할된오른쪽에대해서다시파티션을가함 : self-swap ( 결과 p = 3) p 3 13

Section 06 피보나치수열 피보나치수열 F(n) = F(n-1) + F(n-2) ( 단, F(0) = 0, F(1) = 1) int Fibonacci(int n) { if (n < 2) 베이스케이스 return 1; F(0) = F(1) = 1 else return (Fibonacci(n-1) + Fibonacci(n-2)); 재귀호출 [ 그림 4-5] 피보나치수열의재귀호출 14

Step 1 Section 07 재귀함수의작성 재귀함수작성 더작은문제로표시할수있는지시도 문제크기를하나씩줄이는방법 반으로줄이는방법 다른여러개의작은문제의조합으로표시하는방법문제크기파라미터 N 을확인 Step 2 문제를직접풀수있는것이어떤경우인지베이스케이스확인 Step 3 N 이줄어서반드시베이스케이스를만나는지확인 N 이양수인지음수인지, 짝수인지홀수인지, 또는부동소수인지정수인지모든경우에대해모두검증. Step 4 베이스케이스와베이스케이스가아닌경우를나누어서코드를작성 15

Section 08 재귀호출의효율성 재귀호출의효율성활성화레코드의비효율 공간적비효율 ( 저장공간 ) 시간적비효율 ( 저장, 복원에걸리는시간 ) 가능하다면반복문으로대치하는것이유리 16

재귀호출의반복문변환 int Factorial(int n) 팩토리얼 { int product = 1; 곱셈의결과값을초기화 for (int i = 1; i <= n; i++) 1부터 n까지 product *= i; 계속곱해서저장 return product; 결과를리턴 void Reverse(char S[ ], int Size) 문자열뒤집기 { while (Size > 0) 한글자라도남아있을때까지 { printf("%c", S[Size-1]); 일단마지막문자를찍고 --Size; 문자열마지막을한칸앞으로 int Fibonacci(int n) 피보나치수열 { int A[Max]; 배열크기를 n보다크게잡음 F[0] = 1; F[1] = 1; 수열의처음두숫자초기화 for (int i = 2; i <= n; i++) F[2] 부터 n까지 F[i] = F[i-2] + F[i-1]; 앞에서뒤로채워나감 return (F[i]); 배열의마지막요소를돌려줌 17

Section 09 꼬리재귀 꼬리재귀재귀호출명령이함수마지막에위치 되돌아올때할일이없는재귀호출새로운활성화레코드공간을만들지않고이전공간재사용 return (N * Factorial(N-1)); 는꼬리재귀아님 Factorial(N-1) 결과가리턴되면거기에 N을곱하는일이남아있음. 꼬리재귀를사용한팩토리얼 int Factorial(int n, int a) { if (n = = 0) return a; a에결과값이축적됨 else return Factorial(n-1, n*a); 꼬리재귀 18

Thank you 19