슬라이드 1

Similar documents
PowerPoint 프레젠테이션

슬라이드 1

Microsoft PowerPoint - chap-09.pptx

쉽게 풀어쓴 C 프로그래밍

<4D F736F F F696E74202D20C1A639C0E520C7D4BCF6BFCDBAAFBCF6>

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

C 프로그래밊 개요

Microsoft PowerPoint - Chapter8.pptx

Microsoft PowerPoint - ch04 - 함수 pm0130

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

중간고사

쉽게 풀어쓴 C 프로그래밍

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

untitled

슬라이드 1

chap x: G입력

Microsoft PowerPoint - chap06-2pointer.ppt

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

untitled

쉽게 풀어쓴 C 프로그래밍

11장 포인터

Microsoft PowerPoint - [2009] 02.pptx

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

K&R2 Reference Manual 번역본

untitled

Microsoft PowerPoint - chap05-제어문.pptx

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - chap-11.pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - ch07 - 포인터 pm0415

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

본 강의에 들어가기 전

C 프로그래밊 개요

2015 개정교육과정에따른정보과평가기준개발연구 연구책임자 공동연구자 연구협력관

Microsoft PowerPoint - 제11장 포인터(강의)

Microsoft PowerPoint - 제11장 포인터

1장. 유닉스 시스템 프로그래밍 개요

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

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

01장.자료구조와 알고리즘

Microsoft PowerPoint - additional01.ppt [호환 모드]

02장.배열과 클래스

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

Microsoft Word - FunctionCall

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


C++ Programming

Chapter 4. LISTS

윤성우의 열혈 TCP/IP 소켓 프로그래밍

슬라이드 1

Microsoft PowerPoint - chap06-1Array.ppt

슬라이드 1

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

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

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

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

Infinity(∞) Strategy

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

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

PowerPoint Presentation

슬라이드 1

C++ Programming

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint - ch 전처리기, 다중 소스파일 pm1015

슬라이드 1

PowerPoint Template

03장.스택.key

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

설계란 무엇인가?

11장 포인터

문서의 제목 나눔명조R, 40pt

PowerPoint 프레젠테이션

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

Microsoft PowerPoint - chap12-고급기능.pptx

슬라이드 1

Microsoft PowerPoint - C++ 5 .pptx

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

untitled

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

PowerPoint 프레젠테이션

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

PowerPoint 프레젠테이션

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

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

4. 1 포인터와 1 차원배열 4. 2 포인터와 2 차원배열 4. 3 포인터배열 4. 4 포인터와문자그리고포인터와문자열

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

설계란 무엇인가?

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

Microsoft PowerPoint - ch07 - 포인터 pm0415

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

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

중간고사 (자료 구조)

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

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

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

Transcription:

CHAP 2: 순환 (Recursion)

순환 (recursion) 이란? 알고리즘이나함수가수행도중에자기자신을다시호출하여문제를해결하는기법 정의자체가순환적으로 되어있는경우에적합한방법

순환 (recursion) 의예 팩토리얼값구하기 피보나치수열 1 n! n*( n 1)! fib( n) 0 1 fib( n 2) n n 0 ` 1 fib( n 1) if n 0 if n 1 otherwise 이항계수 n C k n1 C 1 k1 n1 C k n 0 or n otherwise k 하노이의탑

팩토리얼프로그래밍 #1 팩토리얼의정의 1 n! n*( n 1)! n 0 n 1 팩토리얼프로그래밍 #1: 위의정의대로구현 (n-1)! 팩토리얼을구하는서브함수 factorial_n_1 를따로제작 int factorial(int n) if( n<= 1 ) return(1); else return (n * factorial_n_1(n-1) );

팩토리얼프로그래밍 #2 팩토리얼프로그래밍 #2: (n-1)! 팩토리얼을현재작성중인함수를다시호출하여계산 ( 순환호출 ) int factorial(int n) if( n <= 1 ) return(1); else return (n * factorial(n-1) ); 3! 은? 3! 를계산하려면 3! = 3*2! 2! 를계산하려면 2! = 2*1! 1! 은 1 3! 는? 2! 는? 1! 는? 6 2 1

순환호출순서 팩토리얼함수의호출순서 factorial(5) = 5 * factorial(4) = 5 * 4 * factorial(3) = 5 * 4 * 3 * factorial(2) = 5 * 4 * 3 * 2 * factorial(1) = 5 * 4 * 3 * 2 * 1 = 120 4 3 factorial(3) if( 3 <= 1 ) return 1; else return (3 * factorial(3-1) ); factorial(2) if( 2 <= 1 ) return 1; else return (2 * factorial(2-1) ); factorial(1) if( 1 <= 1 ) return 1;... 1 2

순환알고리즘의구조 순환알고리즘은다음과같은부분들을포함한다. 순환호출을하는부분 순환호출을멈추는부분 int factorial(int n) if( n <= 1 ) return 1 순환을멈추는부분 else return n * factorial(n-1); 순환호출을하는부분 만약순환호출을멈추는부분이없다면?. 시스템오류가발생할때까지무한정호출하게된다.

순환 <-> 반복 컴퓨터에서의되풀이 순환 (recursion): 순환호출이용 반복 (iteration): for 나 while 을이용한반복 대부분의순환은반복으로바꾸어작성할수있다. 순환 순환적인문제에서는 자연스러운방법 함수호출의오버헤드 1!=1 2!=2 3!=6 3! 를계산하려면 3! = 3*2! 2! 를계산하려면 2! = 2*1! 1! 은 1 반복 수행속도가빠르다. 2! 는? 1! 는? 순환적인문제에대해서는프로그램작성이아주 2 1 어려울수도있다.

팩토리얼의반복적구현 n! n*( n 1 1)*( n 2)* *1 n 1 n 2 int factorial_iter(int n) int k, v=1; for(k=n; k>0; k--) v = v*k; return(v);

거듭제곱값프로그래밍 #1 순환적인방법이반복적인방법보다더효율적인예 숫자 x 의 n 제곱값을구하는문제 : x n 반복적인방법 double slow_power(double x, int n) int i; double r = 1.0; for(i=0; i<n; i++) r = r * x; return(r);

거듭제곱값프로그래밍 #2 순환적인방법 power(x, n) if n=0 then return 1; else if n이짝수 then return power(x 2, n/2); else if n이홀수 then return x*power(x 2, (n-1)/2);

거듭제곱값프로그래밍 #2 순환적인방법

거듭제곱값프로그래밍 #2 순환적인알고리즘의구현 double power(double x, int n) if( n==0 ) return 1; else if ( (n%2)==0 ) return power(x*x, n/2); else return x*power(x*x, (n-1)/2);

거듭제곱값프로그래밍분석 순환적인방법의시간복잡도 만약 n 이 2 의제곱이라고가정하면다음과같이문제의크기가줄어든다. n n 1 2 1 2 2 2 2 2 0 반복적인방법과순환적인방법의비교 반복적인함수 slow_power 순환적인함수 power 시간복잡도 O(n) O(log(n)) 실제수행속도 7.17초 0.47초

거듭제곱값프로그래밍 #3 효율적인반복적알고리즘구현 double power_iter(double x, int n) int odd_value = 1; while(n > 1) if( n%2==0 ) x = x * x; n = n / 2; else odd_value *= x; x = x * x; n = (n-1) / 2; return(odd_value * x);

피보나치수열의계산 #1 순환호출을사용하면비효율적인예 피보나치수열 0,1,1,2,3,5,8,13,21, 0 fib( n) 1 fib( n 2) fib( n 1) n 0 n 1 otherwise 순환적인구현 int fib(int n) if( n==0 ) return 0; if( n==1 ) return 1; return (fib(n-1) + fib(n-2));

피보나치수열의계산 #1 순환호출을사용했을경우의비효율성 같은항이중복해서계산됨 예를들어 fib(6) 을호출하게되면 fib(2) 이 5 번이나중복되어서계산됨 이러한현상은 n 이커지면더심해짐 fib(6) fib(4) fib(5) fib(2) fib(3) fib(3) fib(4) fib(0) fib(1) fib(1) fib(2) fib(1) fib(2) fib(2) fib(3) fib(1) fib(2)

피보나치수열의반복구현 반복구조를사용한구현 int fib_iter(int n) if( n < 2 ) return n; 0 fib( n) 1 fib( n 2) fib( n 1) n 0 n 1 otherwise int i, fib_n, fib_n_1=1, fib_n_2=0; for(i=2;i<=n;i++) fib_n = fib_n_2 + fib_n_1; fib_n_2 = fib_n_1; fib_n_1 = fib_n; return fib_n;

피보나치수열의효율적인순환호출 효율적인순환구현 int fib_tail_recursion(int n, int fib_n_1, int fib_n_2) if( n < 2 ) return n; int fib_n = fib_n_1 + fib_n_2; return fib_tail_recursion(n-1, fib_n, fib_n_1); 0 fib( n) 1 fib( n 2) fib( n 1) n 0 n 1 otherwise // 더욱간단하게정의하면, int fib_tail_recursion(int n, int fib_n_1, int fib_n_2) if( n < 2 ) return n; return fib_tail_recursion(n-1, fib_n_1 + fib_n_2, fib_n_1); fib_tail_recursion(n, 1, 0);

하노이탑문제 문제는막대 A 에쌓여있는원판 n 개를막대 C 로옮기는것이다. 단, 다음의조건을지켜야한다. 한번에하나의원판만이동할수있다 맨위에있는원판만이동할수있다 크기가작은원판위에큰원판이쌓일수없다. 중간의막대를임시적으로이용할수있으나앞의조건들을지켜야한다.

n=3 인경우의해답

일반적인경우에는? n-1 개의원판 1 개의원판 C 를임시버퍼로사용하여 A 에쌓여있는 n-1 개의원판을 B 로옮긴다. A 의가장큰원판을 C 로옮긴다. A 를임시버퍼로사용하여 B 에쌓여있는 n-1 개의원판을 C 로옮긴다.

남아있는문제는? 자, 그러면어떻게 n-1 개의원판을 A 에서 B 로, 또 B 에서 C 로이동하는가? ( 힌트 ) 우리의원래문제가 n 개의원판을 A 에서 C 로옮기는것임을 기억하라. 따라서지금작성하고있는함수의파라미터를 n-1 로바꾸어순환호출하면된다. // 막대 from 에쌓여있는 n 개의원판을막대 tmp 를사용하여막대 to 로옮긴다. void hanoi_tower(int n, char from, char tmp, char to) if (n==1) from 에서 to 로원판을옮긴다. else hanoi_tower(n-1, from, to, tmp); from 에있는한개의원판을 to 로옮긴다. hanoi_tower(n-1, tmp, from, to);

하노이탑최종프로그램 n-1 개의원판을 A 에서 B 로옮기고 n 번째원판을 A 에서 C 로옮긴 다음, n-1 개의원판을 B 에서 C 로옮기면된다. #include <stdio.h> void hanoi_tower(int n, char from, char tmp, char to) if( n==1 ) printf(" 원판 1 을 %c 에서 %c 으로옮긴다.\n",from,to); else hanoi_tower(n-1, from, to, tmp); printf(" 원판 %d 을 %c 에서 %c 으로옮긴다.\n",n, from, to); hanoi_tower(n-1, tmp, from, to); main() hanoi_tower(4, 'A', 'B', 'C');