Recursion SANGJI University KO Kwangman (kkman@sangji.ac.kr)

Slides:



Advertisements
Similar presentations
멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
Advertisements

5 장 조건과 반복 ②. Contents Counting and Looping [while 문 사용 ] Powers of 2 [while 문 사용 ] More Guessing [do 문 사용 ] Election Day [do 문 사용 ] Finding Maximum &
명품 JAVA Programming 제 3 장 반복문, 배열, 예외처리.
어서와 Java는 처음이지! 제3장선택과 반복.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
Activation Records & Recursion
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
C++ Espresso 제2장 제어문과 함수.
제 4장 문 장 배정문 혼합문 제어문 표준 입출력.
C 프로그래밍.
자바란 무엇인가? JDK의 다운로드 및 설치 방법 Hello, Java 프로그램의 작성 자바 프로그램의 작동 원리
쉽게 풀어쓴 C언어 Express 제8장 함수 C Express Slide 1 (of 26)
컴퓨터의 기초 제 4강 - 표준 입출력, 함수의 기초 2006년 4월 10일.
6장. printf와 scanf 함수에 대한 고찰
쉽게 풀어쓴 C언어 Express 제9장 함수와 변수 C Express.
Power Java 제10장 배열.
Choi, Namseok Java 기초 (Java의 제어문과 배열) Choi, Namseok
스택(stack) SANGJI University Kwangman Ko
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
Chapter 9 정렬(sorting) SANGJI University Kwangman KO
7장 배열 배열의 정의 배열의 초기화 1차원 배열 2차원 및 다차원 배열 문자 배열 배열과 구조.
CHAP 2:순환 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
Chapter 06. 선택문.
제 4주 2014년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
Tree & Heap SANGJI University Kwangman Ko
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
2장 표준 입출력 표준 입출력 함수의 종류 형식화된 입출력 문자 입출력 문자열 입출력.
개정판 누구나 즐기는 C언어 콘서트 제6장 반복문 출처: pixabay.
5장 조건과 반복 ②.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
제 6장 함수 Hello!! C 언어 강성호 김학배 최우영.
CHAP 2:순환.
다음 주 과제 3장 읽어오기 숙제 해서 제출하기. 자료구조와 알고리즘, 순환 E304호,
Chap. 1 Data Structure & Algorithms
함수와 변수 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
제어문 & 반복문 C스터디 2주차.
CHAP 2:순환.
CHAP 2:순환 C로 쉽게 풀어쓴 자료구조 생능출판사 Slide 1 (of 19).
제 1 강.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
게임프로그래밍 I - 1차원 배열 - 공주대학교 게임디자인학과 박 찬 교수 2011년 4월 25일.
컴퓨터공학실습(I) 3주 인공지능연구실.
프로그래밍 기초와 실습 Chapter 11 Recursion.
Chapter 11. 배열과 포인터.
CHAP 2:순환 순천향대학교 컴퓨터공학과.
Hanoi Tower.
자바 5.0 프로그래밍.
CHAP 2:순환 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
Chapter 11 해쉬(Hash) SANGJI University Kwangman KO
CHAP 2:순환 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
-Part1- 제7장 반복문이란 무엇인가.
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
컴퓨터 프로그램은 여러 기능의 복합체이다. 라이브러리 함수와 사용자 정의 함수
CHAP 2:순환.
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
-Part2- 제2장 다차원 배열이란 무엇인가.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Report #4 (1) (due 4/4) 문제 #1 3개의 막대 A, B, C와 원판 n개를 전달받아 Hanoi 탑 문제를 해결하는데 필요한 원판의 이동 회수를 구하여 반환하는 hanoi_tower(n, A, B, C)를 작성하라. 여기서 원판 n은 막대 A에 쌓여 있고.
실습과제 1번 /* 1. 멤버 변수로 반경 radius를 갖고, 그 값을 모니터에 출력하는
어서와 C언어는 처음이지 제16장.
C.
제 1장 프로그래밍 언어 소개 1.1 프로그래밍 언어란 무엇인가 1.2 프로그래밍 언어를 배워야 하는 이유
Chapter 09. 배열.
배열, 포인터, 함수 Review & 과제 1, 2.
프로그래밍 기법 최적화 프로그래밍.
강의 #3. 순환(Recursion).
11장. 1차원 배열.
Presentation transcript:

Recursion SANGJI University KO Kwangman (kkman@sangji.ac.kr)

1. 개 요 재귀(recursion)의 정의, 순환 정의하고 있는 개념 자체에 대한 정의 내부에 자기 자신이 포함되어 있는 경우를 의미 알고리즘이나 함수가 수행 도중에 자기 자신을 다시 호출하여 문제를 해결하는 기법 정의자체가 순환적으로 되어 있는 경우에 적합한 방법 예제) 팩토리얼 값 구하기 피보나치 수열 이항계수 하노이의 탑 이진탐색

재귀적 호출 중복적이거나 반복적인 호출을 수행할 때 자기 자신에 대한 호출이 함수 자체에 포함되어 있는 것 직접 순환 (directed recursion) 함수가 직접 자신을 호출하는 경우 간접 순환 (indirected recursion) 다른 제3의 함수를 호출하고 그 함수가 다시 자신을 호출하는 경우 재귀의 기본 아이디어 단계별 수행되는 함수 내부의 절차들이 매 단계에서 조건이 만족하는 경우 최종적인 문제의 해결이 마무리될 때까지 반복되는 것

2. 재귀 응용 : 삼각수 삼각수(Triangular Numbers) 1번째 단계의 값은 1. (이전 단계가 없으므로) n > 1 인 단계의 값, n-1단계에서의 값과 n 단계의 합. 1, 1+2=3, 3+3=4, 6+4=10, 10+5=15, …

Loop를 이용한 구현 번째 삼각수 구하기 (n=4인 경우) // 루프를 이용하여 삼각수 구하기 int triLoop( int n ) { int tot = 0; while ( n > 0 ) { tot = tot + n; // n을 tot 변수에 더한다. --n; // 현재 열의 번호를 감소 } return tot;

재귀를 이용하여 n번째 삼각수 구하기 (n=4인 경우) // 재귀적 방법을 이용한 삼각수 구하기 int triRec ( int n ) { if ( n == 1 ) return 1; else return ( n + triRec( n-1 ) ); }

3. 재귀 응용 : 순차 곱셈 순차곱셈(factorials)표기법

팩토리얼 프로그래밍 팩토리얼 함수의 호출 순서 int factorial(int n) { 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 int factorial(int n) { if( n <= 1 ) return(1); else return (n * factorial(n-1) ); }

else return (2 * factorial(2-1) ); } if( 2 <= 1 ) return 1;     else return (2 * factorial(2-1) ); } factorial(1) { if( 1 <= 1 ) return 1; ..... ① ② ③ ④ factorial(3) { if( 3 <= 1 ) return 1;     else return (3 * factorial(3-1) );

4. 재귀응용 : 거듭제곱 순환적인 방법이 반복적인 방법보다 더 효율적인 예 숫자 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); }

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); }

5. 재귀 응용 : 피보나치 순열 피보나치 순열 자신의 이전 이전 수와 이전수의 합으로 만들어진 수들의 집합 4번째 피보나치 수가 해지는 과정

순환 호출을 사용하면 비효율적인 예 피보나치 수열 순환적인 구현 int fib(int n) { 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(3)이 4번이나 중복되어서 계산됨 이러한 현상은 n이 커지면 더 심해짐 fib(6) fib(4) fib(5) fib(2) fib(3) 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;

순환 방법에서 주의할 점 순환 알고리즘은 다음과 같은 부분들을 포함한다. 순환 호출을 하는 부분 순환 호출을 멈추는 부분 else return n * factorial(n-1); int factorial(int n) { 순환호출을 하는 부분 } if( n <= 1 ) return 1 순환을 멈추는 부분

컴퓨터에서의 되풀이 순환 반복 순환(recursion): 순환 호출 이용 반복(iteration): for나 while을 이용한 반복 대부분의 순환은 반복으로 바꾸어 작성할 수 있음 순환 순환적인 문제에서는 자연스러운 방법 함수 호출의 오버헤드 반복 수행 속도가 빠름 순환적인 문제에 대해서는 프로그램 작성이 아주 어려울 수도 있음.

6. 재귀 응용 : 하노이 탑 하노이의 탑(Tower of Hanoi) 문제 고대 인도로부터 내려오는 수수께끼 가운데 구멍이 뚤린 원판(disk)들을 현재 기둥(column) ‘가’에서 ‘다’로 이동시키는 문제

방법 막대 가 에 쌓여있는 원판 n개를 막대 다로 이동 방법. 한 번에 하나의 원판만 이동. 맨 위에 있는 원판만 이동. 크기가 작은 원판 위에 큰 원판이 쌓일 수 없음. 중간의 막대를 임시적으로 이용할 수 있으나 앞의 조건을 준수.

Towers of Hanoi in 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');

Towers of Hanoi in Java class Hanoi { static int num_disk = 3; public static void main( String[] args ) { moveDisk( num_disk, 'A', 'B', 'C' ); // 최초 호출 } public static void moveDisk( int top, char from, char mid, char to ) { if ( top == 1 ) System.out.println( "원판 1이 기둥 " + from + "에서 기둥 " + to +"로 이동" ); else { moveDisk( top - 1, from, to, mid ); // from에서 mid로 이동 System.out.println("원판 " + top + "이 기둥 " + from + "에서 기둥 " + to +"로 이동"); moveDisk( top - 1, mid, from, to ); // mid에서 to로 이동