프로그래밍 기초와 실습 Chapter 11 Recursion.

Slides:



Advertisements
Similar presentations
스택 스택 추상자료형 스택 스택의 구현 스택의 응용 한빛미디어(주).
Advertisements

제6장 조건문.
프로그래밍1 및 실습 (C언어) - 3장 기본자료형 (3.6부터 끝까지) -
Recursion SANGJI University KO Kwangman
Activation Records & Recursion
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
Power C++ 제6장 포인터와 문자열.
배열, 포인터 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
C++ Espresso 제2장 제어문과 함수.
쉽게 풀어쓴 C언어 Express 제8장 함수 C Express.
C 프로그래밍.
쉽게 풀어쓴 C언어 Express 제8장 함수 C Express.
C 6장. 함수 #include <stdio.h> int main(void) { int num;
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
C 10장. 함수의 활용 #include <stdio.h> int main(void) { int num;
C 11장. 포인터의 활용 #include <stdio.h> int main(void) { int num;
제5장 제어명령
C언어: 배열 (Arrays).
6장. printf와 scanf 함수에 대한 고찰
쉽게 풀어쓴 C언어 Express 제9장 함수와 변수 C Express.
Chapter 13 문자 데이터와 문자열 문자 데이터 문자열.
자료구조 김현성.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
C 7장. 배열과 문자열 #include <stdio.h> int main(void) { int num;
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
CHAP 9:정렬 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
7장 배열 배열의 정의 배열의 초기화 1차원 배열 2차원 및 다차원 배열 문자 배열 배열과 구조.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
C언어 프로그래밍의 이해 Ch05. 명령문 Phylogenetic: 계통, 발생(학)의.
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express.
6장 배열.
쉽게 풀어쓴 C언어 Express 제7장 반복문 C Express.
정렬과 합병.
4장 제어문 선택문: if 문, if – else 문, switch 문
개정판 누구나 즐기는 C언어 콘서트 제6장 반복문 출처: pixabay.
C언어 프로그래밍의 이해 Ch13. 선행처리기와 주석문.
제 6장 함수 Hello!! C 언어 강성호 김학배 최우영.
11장. 1차원 배열 IT응용시스템공학과 김 형 진 교수.
제 4장 전처리기와 매크로 Hello!! C 언어 강성호 김학배 최우영.
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
CHAP 9: 정렬 (part 2) 순천향대학교 컴퓨터학부 하 상 호.
함수와 변수 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
CHAP 2:순환.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
게임프로그래밍 I - 1차원 배열 - 공주대학교 게임디자인학과 박 찬 교수 2011년 4월 25일.
Chapter 11. 배열과 포인터.
조 병 규 Software Quality Lab. 한국교통대학교
#1 배열 활용 #include int main(void) { int i; int grade[5]; grade[0] = 10; grade[1] = 20; grade[2] = 30; grade[3] = 40; grade[4] = 50; for(i=0;i.
6장 반복제어문 for 문 while 문 do while 문 기타 제어문.
C언어 프로그래밍의 이해 Ch05. 명령문.
-Part1- 제7장 반복문이란 무엇인가.
-Part1- 제8장 조건문이란 무엇인가 (교재 199페이지 ~ 224페이지)
CHAP 9:정렬 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
-Part2- 제2장 다차원 배열이란 무엇인가.
반복문의 기능 반복문 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 while문
9주차: Using Files and Others
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
어서와 C언어는 처음이지 제16장.
개정판 누구나 즐기는 C언어 콘서트 제10장 문자열 출처: pixabay.
어서와 C언어는 처음이지 제23장.
C 프로그래밍은 매우 도전적인 작업이다. 도전의 이면에 철저한 준비와 체계적인 노력
Chapter 09. 배열.
배열, 포인터, 함수 Review & 과제 1, 2.
11장. 1차원 배열.
Presentation transcript:

프로그래밍 기초와 실습 Chapter 11 Recursion

Contents Recursive Problem Solving Drawing Patterns on the Screen (Example) String handling Using Recursion (Example) Quick Sort (The Divide-and-Conquer Methodology)

Recursive Problem Solving 재귀호출 어떤 함수가 자기 자신을 호출하는 것 [Ex] #include <stdio.h> void count_down(int n); int main(void) { count_down(10); return 0; } void count_down(int n) if( n ) { printf(“%d ! ”, n); count_down( n – 1 ); else printf(“\nBLAST OFF\n”); 10 ! 9 ! 8 ! 7 ! 6 ! 5 ! 4 ! 3 ! 2 ! 1 ! BLAST OFF

Recursive Problem Solving factorial을 구하는 예제 [Ex] /* Recursive version */ int fact( int n) { if ( n <= 1 ) return 1; else return n * fact ( n - 1 ); } [Ex] /* Iterative version */ int fact( int n ) int result = 1; for ( ; n > 1; --n ) result *= n; return result; What i = fact(3) returns fact ( 3 ) 3 * fact (2 ) 3 * ( 2 * fact ( 1 ) ) 3 * ( 2 * ( 1 ) ) = 6

Recursive Problem Solving 합을 구하는 예제 [Ex] /* Recursive version */ int sum ( int n ) { if ( n <= 1 ) return n; else return ( n + sum ( n – 1 ) ); } [Ex] /* Iterative version */ int sum = 0; while ( n <= 5 ) sum += n; return sum; What sum() returns Function call Value returned sum(1) sum(2) sum(3) sum(4) 1 2 + sum (1) or 2 + 1 3 + sum (2) or 3 + 2 + 1 4 + sum (3) or 4 + 3 + 2 + 1 = 10

Recursive Problem Solving array의 평균을 구하는 예제 [Ex] /* recursion 사용 */ double average(double a[], int n) { if ( n == 1 ) return a[0]; else return ((a[n – 1] + (n – 1 ) * average(a, n – 1 )) /n ); } [Ex] /* 반복문 사용 */ double sum = 0.0; int i; for(i = 0; i < n; ++i) sum += a[i]; return (sum / n);

Drawing Patterns on the Screen 제곱근을 구하는 예제 [Ex] /* Recursive version */ int power ( int x, int n ) { if ( n == 0 ) return 1; else return x * power( x, n – 1 ); } [Ex] /* Iterative version */ int pow = 1; for ( ; n > 0; n--) pow *= x; return pow; return n == 0 ? 1 : x * power (x, n – 1); 와 같다. What power(5, 3) returns power ( 5, 3 ) 5 * power ( 5, 2) 5 * ( 5 * ( power(5, 1) ) ) 5 * ( 5 * ( 5 * (power (5, 0 ) ) ) 5 * ( 5 * ( 5 * ( 1 ) ) ) = 125

Drawing Patterns on the Screen 역순으로 문자를 출력하는 예제 입력 받은 문장의 문자들을 역순으로 출력한다. [Ex] /* Write a line backward. */ #include <stdio.h> void prn_it(void); int main(void) { printf(“Input a line: “); prn_it(); printf(“\n\n”); return 0; } void prn_it(void) char c; if( ( c = getchar() ) != ‘\n’) putchar(c); Input a line: sing a song of sixpence ꎠ ecnepxis fo gnos a gnis

Drawing Patterns on the Screen 역순으로 단어를 출력하는 예제 입력 받은 문장의 단어들을 역순으로 출력한다. #include <ctype.h> #include <stdio.h> #define MAXWORD 100 void prn_it_by_word(void); void get_word(char *); int main(void) { printf("input a line: "); prn_it_by_word(); printf("\n\n"); return 0; } void prn_it_by_word(void) char w[MAXWORD]; get_word(w); if (w[0] != '\n') printf("%s ", w); /* continue… */ get_word로 받아들인 문자가 new line이 아닐 때까지 prn_it_by_word()를 recursive 로 호출 prn_it_by_word()함수를 호출

Drawing Patterns on the Screen 역순으로 단어를 출력하는 예제 void get_word(char *s) { static char c = '\0'; if( c == '\n' ) *s++ = c; else while ( !isspace( c = getchar() ) ) *s = '\0'; } Input a line: deep in the heart of texas ꎠ texas of heart the in deep

String handling Using Recursion 특정 조건에 의해 문자열 출력하는 예제 [Ex] #include <stdio.h> void reverse(char *s, int j , int k ); void swap(char *, char *); int main(void) { char phrase[] = "by the sea, by the beautiful sea"; reverse(phrase, 3, 17); printf("%s\n", phrase); return 0; } void reverse(char *s, int j, int k ){ if(j < k) { swap(&s[j], &s[k]); reverse(s, ++j, --k); void swap(char *p, char *q) { char tmp; tmp = *p; *p = *q; *q = tmp; reverse[3] ~ reverse[17]에 있는 문자들을 3-17, 4-16, 5-15, 6-14, …번째의 문자들을 각각 swap하는 부분이다. by eht yb, aes eht beautiful sea

Quick Sort Quick Sort의 Sorting process 12 3 6 18 7 15 10 low high 3 6 low는 첫 번째 element, high는 마지막 element로 지정 12 3 6 18 7 15 10 low high high와 low를 비교해서 큰수를 buffer에 저장한 후 low에 10을 저장하고 low + 1 . 3 6 18 7 15 10 12 low high 3과 12를 비교해서 12가 3보다 크므로 low + 1 . 10 3 6 18 7 15 12 low high

Quick Sort Quick Sort의 Sorting process 10 3 6 18 7 15 12 low high 10 3 6과 12를 비교해서 12가 6보다 크므로 low + 1 . 10 3 6 18 7 15 12 low high low가 18이고 high가 12이므로 18이 12보다 크므로 18을 high에 넣고 high – 1 . 10 3 6 18 7 15 12 low high 15와 12의 값을 비교 10 3 6 7 15 18 12 low high

Quick Sort Quick Sort의 Sorting process 10 3 6 7 15 18 12 low high 10 3 15보다 12가 크므로 다시 high – 1 하여 7을 기억. 10 3 6 7 15 18 12 low high 12보다 7이 작으므로 7을 low의 element에 저장한 후 low + 1. 10 3 6 7 15 18 12 low, high low가 가리키는 값과 high가 가리키는 값이 같으면 buffer에 있던 12를 저장하고 해당 process 종료. 10 3 6 7 12 15 18 low middle 10 3 6 7 12 15 18 next process middle를 중심으로 왼쪽은 작은 값 오른쪽은 큰값.

Quick Sort Quick Sort code #include <stdio.h> #define N 10 void quicksort(int a[], int low, int high); int split (int a[], int low, int high ); void main(void) { int a[N], i; printf("Enter %d numbers to be sorted: ", N); for ( i = 0; i < N; i++ ) scanf("%d", &a[i]); quicksort(a, 0, N - 1); printf("In sorted order: "); for( i = 0; i < N; i++ ) printf("%d ", a[i]); printf("\n"); return 0; }

Quick Sort Quick Sort 예제 void quicksort( int a[], int low, int high ) { int middle; if (low >= high) return; middle = split(a, low, high); quicksort(a, low, middle - 1); quicksort(a, middle + 1, high ); } low와 high가 가리키는 기억장소의 위치가 서로 만나는 곳을middle로 한다. middle보다 작은 왼쪽구간 에 대해서 quicksort를 같은 과정으로 실행 middle보다 큰 오른쪽구간 에 대해서 quicksort실행 quicksort는 recursive function이다.

Quick Sort int split( int a[], int low, int high ) { int part_element = a[low]; for( ; ; ) while ( low < high && part_element <= a[high] ) high--; if (low >= high) break; a[low++] = a[high]; while(low < high && a[low] <= part_element) low++; if(low >= high ) a[high--] = a[low]; } a[high] = part_element; return high; low와 high가 가리키는 기억장소 의 위치를 각각 증가, 감소 시키는 함수부분. Enter 10 numbers to be sorted: 9 16 47 82 4 66 12 3 25 51 ꎠ In sorted order: 3 4 9 12 16 25 47 51 66 82

수고하셨습니다 Recursion