강의 #3. 순환(Recursion).

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.
쉽게 풀어쓴 C언어 Express 제8장 함수 C Express.
C 프로그래밍.
쉽게 풀어쓴 C언어 Express 제8장 함수 C Express.
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 1 강원대학교 컴퓨터과학전공 문양세.
쉽게 풀어쓴 C언어 Express 제8장 함수 C Express Slide 1 (of 26)
4장: 자료형과 수식.
컴퓨터의 기초 제 4강 - 표준 입출력, 함수의 기초 2006년 4월 10일.
쉽게 풀어쓴 C언어 Express 제9장 함수와 변수 C Express.
CHAP 2:순환 순천향대학교 컴퓨터공학과.
Internet Computing KUT Youn-Hee Han
7장 배열 배열의 정의 배열의 초기화 1차원 배열 2차원 및 다차원 배열 문자 배열 배열과 구조.
CHAP 2:순환 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
CHAP 1:자료구조와 알고리즘 C로 쉽게 풀어쓴 자료구조 생능출판사 Slide 1 (of 28)
쉽게 풀어쓴 C언어 Express 제9장 함수와 변수 C Express.
쉽게 풀어쓴 C언어 Express 제9장 함수와 변수 C Express Slide 1 (of 33)
12 검색.
9장. 동적 프로그래밍Dynamic Programming (DP)
Tree & Heap SANGJI University Kwangman Ko
개정판 누구나 즐기는 C언어 콘서트 제6장 반복문 출처: pixabay.
배열과 연결리스트 연결리스트 배열 메모리 할당이 연속적이어서 인덱스 사용시 검색이 빠르다.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
제 6장 함수 Hello!! C 언어 강성호 김학배 최우영.
CHAP 2:순환.
Ch.03 Dynamic Programming (동적 프로그래밍 or 동적 계획법)
다음 주 과제 3장 읽어오기 숙제 해서 제출하기. 자료구조와 알고리즘, 순환 E304호,
제1장 자료구조를 배우기 위한 준비.
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 년 봄학기
Chap. 1 Data Structure & Algorithms
쉽게 풀어쓴 C언어 Express 제15장 전처리 및 비트연산 C Express Slide 1 (of 29)
함수와 변수 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
Power Point 2007년 정보화교육 원미구청 총무과 통신전산팀.
제어문 & 반복문 C스터디 2주차.
4장 - PHP의 표현식과 흐름 제어-.
CHAP 2:순환.
CHAP 2:순환 C로 쉽게 풀어쓴 자료구조 생능출판사 Slide 1 (of 19).
제 1 강.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
프로그래밍 기초와 실습 Chapter 11 Recursion.
Chapter 11. 배열과 포인터.
CHAP 2:순환 순천향대학교 컴퓨터공학과.
김선균 컴퓨터 프로그래밍 기초 - 7th : 함수 - 김선균
CHAP 2:순환 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
6장 반복제어문 for 문 while 문 do while 문 기타 제어문.
CHAP 8:우선순위큐.
CHAP 2:순환 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
CHAP 12:탐색 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
CHAP 12 : 탐색.
CHAP 12 : 탐색 C로 쉽게 풀어쓴 자료구조 생능출판사 2011.
-Part1- 제7장 반복문이란 무엇인가.
-Part1- 제8장 조건문이란 무엇인가 (교재 199페이지 ~ 224페이지)
CHAP 1:자료구조와 알고리즘.
7주차: Functions and Arrays
CHAP 2:순환.
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
-Part2- 제2장 다차원 배열이란 무엇인가.
CHAP 8:우선순위큐 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
9주차: Using Files and Others
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
프로그래밍 기법 최적화 프로그래밍.
11장. 1차원 배열.
Presentation transcript:

강의 #3. 순환(Recursion)

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

팩토리얼 프로그래밍(1) 팩토리얼(factorial)의 정의 팩토리얼 프로그래밍 #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 * 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!는? 1 2

팩토리얼의 반복적 구현 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=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(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의 제곱이라고 가정하면 다음과 같이 문제의 크기가 줄어든다. 반복적인 방법과 순환적인 방법의 비교   반복적인 함수 slow_power 순환적인 함수 power 시간복잡도 O(n) O(logn) 실제수행속도 7.17초 0.47초

피보나치 수열의 계산(1) 순환 호출을 사용하면 비효율적인 예 피보나치 수열 순환적인 구현 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)); }

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

피보나치 수열의 반복구현 반복 구조를 사용한 구현 int 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;