CHAP 2:순환.

Slides:



Advertisements
Similar presentations
Recursion SANGJI University KO Kwangman
Advertisements

Activation Records & Recursion
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
Power C++ 제6장 포인터와 문자열.
CHAP 1:자료구조와 알고리즘.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
C++ Espresso 제2장 제어문과 함수.
CHAP 1:자료구조와 알고리즘 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
쉽게 풀어쓴 C언어 Express 제8장 함수 C Express.
C 프로그래밍.
쉽게 풀어쓴 C언어 Express 제8장 함수 C Express.
쉽게 풀어쓴 C언어 Express 제8장 함수 C Express Slide 1 (of 26)
제5장 제어명령
C언어: 배열 (Arrays).
컴퓨터의 기초 제 4강 - 표준 입출력, 함수의 기초 2006년 4월 10일.
Autokey Cipher 자동키 암호 Department of Cyber Security / 박건주.
6장. printf와 scanf 함수에 대한 고찰
쉽게 풀어쓴 C언어 Express 제9장 함수와 변수 C Express.
7. while 문의 흐름 제어.
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
7장 배열 배열의 정의 배열의 초기화 1차원 배열 2차원 및 다차원 배열 문자 배열 배열과 구조.
CHAP 2:순환 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
Chapter 06. 선택문.
Chapter 10. 포인터.
CHAP 1:자료구조와 알고리즘 C로 쉽게 풀어쓴 자료구조 생능출판사 Slide 1 (of 28)
쉽게 풀어쓴 C언어 Express 제9장 함수와 변수 C Express Slide 1 (of 33)
13. 포인터와 배열! 함께 이해하기.
2장 표준 입출력 표준 입출력 함수의 종류 형식화된 입출력 문자 입출력 문자열 입출력.
개정판 누구나 즐기는 C언어 콘서트 제6장 반복문 출처: pixabay.
C언어 프로그래밍의 이해 Ch13. 선행처리기와 주석문.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
제 6장 함수 Hello!! C 언어 강성호 김학배 최우영.
CHAP 2:순환.
11장. 1차원 배열 IT응용시스템공학과 김 형 진 교수.
다음 주 과제 3장 읽어오기 숙제 해서 제출하기. 자료구조와 알고리즘, 순환 E304호,
함수와 변수 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
제어문 & 반복문 C스터디 2주차.
CHAP 2:순환 C로 쉽게 풀어쓴 자료구조 생능출판사 Slide 1 (of 19).
제 1 강.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
게임프로그래밍 I - 1차원 배열 - 공주대학교 게임디자인학과 박 찬 교수 2011년 4월 25일.
프로그래밍 기초와 실습 Chapter 11 Recursion.
Chapter 11. 배열과 포인터.
CHAP 2:순환 순천향대학교 컴퓨터공학과.
Hanoi Tower.
실습과제 1(조건문, ) 표준입력으로 수축기 혈압을 입력 받아 그에 따른 적당한 표현을 화면에 출력하는 프로그램을 if-else 문을 이용하여 작성.
CHAP 2:순환 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
-Part2- 제1장 1차원 배열이란 무엇인가.
6장 반복제어문 for 문 while 문 do while 문 기타 제어문.
CHAP 8:우선순위큐.
CHAP 2:순환 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
-Part1- 제7장 반복문이란 무엇인가.
18장. 다차원 배열 그리고 포인터.
-Part1- 제8장 조건문이란 무엇인가 (교재 199페이지 ~ 224페이지)
CHAP 1:자료구조와 알고리즘.
컴퓨터 프로그램은 여러 기능의 복합체이다. 라이브러리 함수와 사용자 정의 함수
CHAP 2:순환.
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
-Part2- 제2장 다차원 배열이란 무엇인가.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
어서와 C언어는 처음이지 제16장.
17장. 포인터의 포인터.
C.
Chapter 09. 배열.
배열, 포인터, 함수 Review & 과제 1, 2.
강의 #3. 순환(Recursion).
11장. 1차원 배열.
Presentation transcript:

CHAP 2:순환

순환(recursion)이란? 알고리즘이나 함수가 수행 도중에 자기 자신을 다시 호출하여 문제를 해결하는 기법 정의자체가 순환적으로 되어 있는 경우에 적합한 방법 (예제) 팩토리얼 값 구하기 피보나치 수열 하노이의 탑 이진탐색

팩토리얼 프로그래밍 (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 * 3 * 2 * 1 = 120 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; ..... }

순환 알고리즘의 구조 순환 알고리즘은 다음과 같은 부분들을 포함한다. 만약 순환 호출을 멈추는 부분이 없다면?. 순환 호출을 하는 부분 순환 호출을 멈추는 부분 else return n * factorial(n-1); int factorial(int n) { 순환을 멈추는 부분 순환호출을 하는 부분 } if( n <= 1 ) return 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

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

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

거듭제곱 프로그래밍 #2 순환적인 방법 power(x, n) if n=0 then return 1; else if n이 짝수 then return power(x2,n/2); else if n이 홀수 then return x*power(x2, (n-1)/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의 m승이라고 가정하면 다음과 같이 문제의 크기가 줄어든다. 반복적인 방법과 순환적인 방법의 비교   slow_power power 시간복잡도 O(n) O(logn)

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

피보나치 수열의 순환 구현 순환 호출을 사용했을 경우의 비효율성 fib(6) fib(4) fib(5) fib(2) fib(3) 같은 항이 중복해서 계산됨 예를 들어 fib(6)을 호출하게 되면 fib(3)이 3번이나 중복되어서 계산됨 이러한 현상은 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(0) fib(1) fib(0) fib(1) fib(0) fib(1)

피보나치 수열의 반복구현 반복 구조를 사용한 구현 fib_iter(int n) { if( n < 2 ) return n; else { int i, tmp, current=1, last=0; for(i=2;i<=n;i++){ tmp = current; current += last; last = tmp; } return current;

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

n=3인 경우의 해답 A B C A B C

일반적인 경우에는? 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); }

하노이탑 최종 프로그램 #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');