Microsoft PowerPoint - chap05.ppt

Similar documents
슬라이드 1

슬라이드 1

슬라이드 1

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

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

Microsoft PowerPoint - chap06-2pointer.ppt

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

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

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

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - 04_C_Language_Function

PowerPoint 프레젠테이션

Microsoft PowerPoint - Chapter8.pptx

Microsoft PowerPoint - chap-09.pptx

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

C 언어와 프로그래밍 개요

쉽게 풀어쓴 C 프로그래밍

<4D F736F F F696E74202D20C1A639C0E520C7D4BCF6BFCDBAAFBCF6>

untitled

쉽게 풀어쓴 C 프로그래밍

OCW_C언어 기초

Microsoft PowerPoint - chap-03.pptx

C 프로그래밊 개요

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - chap03-변수와데이터형.pptx

C언어 및 실습 C Language and Practice

슬라이드 1

11장 포인터

PowerPoint 프레젠테이션

Microsoft PowerPoint - Lesson2.pptx

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

C 프로그래밊 개요

Microsoft PowerPoint - ch07 - 포인터 pm0415

제4장 기본 의미구조 (Basic Semantics)

PowerPoint Presentation

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

슬라이드 1

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - chap12-고급기능.pptx

PowerPoint Presentation

슬라이드 1

OCW_C언어 기초

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

Microsoft PowerPoint - 08-C-App-19-Quick-Preprocessor

Microsoft PowerPoint - chap08.ppt

슬라이드 1

untitled

Microsoft PowerPoint - chap06-1Array.ppt

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

슬라이드 1

Microsoft PowerPoint - ch01.ppt

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

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

<4D F736F F F696E74202D20C1A633C0E52043C7C1B7CEB1D7B7A5B1B8BCBABFE4BCD2>

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

K&R2 Reference Manual 번역본

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

C 프로그램의 기본

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

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

Microsoft PowerPoint - 제11장 포인터

Microsoft Word - FunctionCall

C 언어와 프로그래밍 개요

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - [2009] 02.pptx

OCW_C언어 기초

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

Microsoft PowerPoint - chap05-제어문.pptx

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap06.ppt

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

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

PowerPoint Template

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

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

Microsoft PowerPoint - chap-11.pptx

Infinity(∞) Strategy

Microsoft PowerPoint - C++ 5 .pptx

설계란 무엇인가?

untitled

Microsoft PowerPoint - chap08-1 [호환 모드]

C++ Programming

중간고사

1. 표준입출력 C++ : C의모든라이브러리를포함 printf, scanf 함수사용가능예 : int, double, 문자열값을입력받고출력하기 #include <cstdio> int ivar; double dvar; char str[20]; printf("int, dou

PowerPoint 프레젠테이션

프로그램의실행화면 주석 (comment) 두수의합 : 300 /* 두개의숫자의합을계산하는프로그램 */ 주석은코드를설명하는글입니다. 주석 3 가지방법의주석 주석의예 /* 한줄로된주석 */ /* 저자 : 홍길동날짜 : 2013.


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

Microsoft PowerPoint - Chapter 1-rev

ABC 6장

설계란 무엇인가?

슬라이드 1

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

Microsoft PowerPoint - 05장(함수) [호환 모드]

컴파일러

Transcription:

2010-1 학기프로그래밍입문 (1) 5 장함수 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 0

목차 5.1 함수정의 5.2 return 문 5.3 함수원형 5.4 예제 : 거듭제곱표생성하기 5.5 컴파일러관점에서의함수선언 5.6 함수정의순서의다른방법 5.7 함수호출과값에의한호출 5.8 대형프로그램의개발 5.9 단정 5.10 유효범위규칙 5.11 기억영역클래스 5.12 정적외부변수 5.13 디폴트초기화 5.14 재귀 5.15 예제 : 하노이탑 A Book on C, 4ed. 5-1

함수 하향식프로그래밍기법 프로그램은하나이상의함수로구성됨 함수정의 - 함수가수행할일을기술한 C 코드 함수정의의일반적인형식 type function_name( parameter list ) declarations statements A Book on C, 4ed. 5-2

함수헤더 헤더 -함수정의에서첫번째여는중괄호의앞부분 type function_name( parameter list ) A Book on C, 4ed. 5-3

함수헤더 type function_name( parameter list ) - type -함수가리턴하는값의형 -컴파일러는필요하다면, 함수의리턴값을이 type으로변환함 -이것이 void이면리턴하는값이없다는것을나타냄 - parameter list -이함수가가지는인자의목록 -이함수를호출할때에는이 list에맞게호출해야함 -이것이 void이면인자를갖지않음을나타냄 A Book on C, 4ed. 5-4

함수몸체 몸체 - 함수정의에서중괄호사이에있는문장들 예제 int factorial(int n) /* header */ /* body starts here */ int i, product = 1; for (i = 2; i <= n; ++i) product *= i; return product; A Book on C, 4ed. 5-5

함수정의및호출 함수정의 void wrt_address(void) printf("%s\n%s\n%s\n%s\n%s\n\n", " *********************", " ** SANTA CLAUS *", " ** NORTH POLE *", " ** EARTH *", " *********************"); 함수호출 for (i = 0; i < 3; ++i) wrt_address(); A Book on C, 4ed. 5-6

예 void northing(void) /* this function does nothing */ double twice(double x) return (2.0 * x); int all_add(int a, int b) /* 복합문형태가능 */ int c; /* 선언포함 */... return( a + b +c); /* 연산결과 return */ A Book on C, 4ed. 5-7

함수형이정의되지않은경우 ==> 기본적으로 int형 all_add(int a, int b) /* 함수형정의생략가능 */ /* 복합문형태가능 */ int c; /* 선언포함 */... return( a + b +c); /* 연산결과 return */ ==> 함수형정확하게명시하는것이바람직함 A Book on C, 4ed. 5-8

지역적 / 전역적변수 지역변수 -함수몸체안에서선언된변수 전역변수 - 함수외부에서선언된변수 A Book on C, 4ed. 5-9

지역적 / 전역적변수 int a = 33; /* a is external and initialized to 33 */ int main(void) int b = 77; /* b is local to main() */ printf("a = %d\n", a); /* a is global to main() */ printf("b = %d\n", b); return 0; A Book on C, 4ed. 5-10

전통적인 C 전통적인 C에서는매개변수목록에있는변수들의선언이매개변수목록과첫번째중괄호사이에옴 void f(a, b, c, x, y) inf a, b, c; double x, y;... A Book on C, 4ed. 5-11

전통적인 C 매개변수가없다면빈괄호만써줌 void f1( )... A Book on C, 4ed. 5-12

return 문 return 문을만나면, 그함수의실행은종료되고제어는호출한환경으로넘어감 만일 return 문이수식을포함하고있으면, 그수식의값도호출한환경으로같이넘어감 또한필요하다면, 그수식의값은함수정의에명시된함수의형으로변환됨 A Book on C, 4ed. 5-13

일반적인형식 return; return expression; 예 return; return ++a; return (a * b); return 문 A Book on C, 4ed. 5-14

return 문예제 float f(char a, char b, char c) int i;... return i; /* value returned will be converted to a float */ A Book on C, 4ed. 5-15

return 문예제 double absolute_value(double x) if (x >= 0.0) return x; else return -x; A Book on C, 4ed. 5-16

새로운함수선언구문 함수원형 컴파일러에게함수로전달되는인자의수와형그리 고함수의리턴값의형을알려줌 일반적인형식 type function_name(parameter type list); A Book on C, 4ed. 5-17

함수원형 type function_name(parameter type list); - parameter type list 에서식별자의사용은옵션 void f(char c, int i); void f(char, int); - 가변인자는 parameter type list 를 으로표현 printf(const char *, ) A Book on C, 4ed. 5-18

예제 : 거듭제곱표생성하기 교과서 207 페이지 A Book on C, 4ed. 5-19

컴파일러관점에서의함수선언 컴파일러는여러방법으로함수선언을인식함 -함수호출 - 만일함수선언이나정의전에f(x) 와같은함수호출을사용했다면컴파일러는디폴트로다음과같은형태를가정함 int f(); -함수정의 - 함수선언 / 함수원형 A Book on C, 4ed. 5-20

함수정의순서 main() 함수의위치에따라 - main() 을다른함수보다먼저정의 - 다른함수를사용할수있게하기위해다른모든함수 의함수원형을 main() 앞에선언해야함 - main() 을다른함수다음에정의 ( 예제 ) A Book on C, 4ed. 5-21

예 ) main() 맨뒤에위치 #include <stdio.h> #define N 7 void prn_heading(void)... long power(int m, int n)... A Book on C, 4ed. 5-22

void prn_tbl_of_powers(int n)... int main(void) prn_heading() prn_tbl_of_powers(n) return 0; A Book on C, 4ed. 5-23

함수호출 프로그램은하나의 main() 함수와다른함수들로구성됨 함수관점에서의프로그램수행 - 프로그램은항상 main() 함수부터수행됨 - 프로그램의제어가함수이름을만나면그함수가호출됨 - 함수가호출되면프로그램의제어는호출된함수로넘어가고그함수를수행함 - 호출된함수가실행을완료하면프로그램의제어는그함수를호출한환경으로다시넘어가고, 제어를다시받은함수는자기일을계속수행함 A Book on C, 4ed. 5-24

제어의흐름 #include <stdio.h> int test(int); int main(void) int b, a; int test(int c) c = c + 10; return 1; a = 5; b = test(a); printf("test is %d", b); return 0; int printf(... )..... A Book on C, 4ed. 5-25

제어의흐름 #include <stdio.h> int test(int); int main(void) int b, a; int test(int c) c = c + 10; return 1; a = 5; b = test(a); printf("test is %d", b); return 0; int printf(... )..... A Book on C, 4ed. 5-26

제어의흐름 #include <stdio.h> int test(int); int main(void) int b, a; int test(int c) c = c + 10; return 1; a = 5; b = test(a); printf("test is %d", b); return 0; int printf(... )..... A Book on C, 4ed. 5-27

제어의흐름 #include <stdio.h> int test(int); int main(void) int b, a; int test(int c) c = c + 10; return 1; a = 5; b = test(a); printf("test is %d", b); return 0; int printf(... )..... A Book on C, 4ed. 5-28

제어의흐름 #include <stdio.h> int test(int); int main(void) int b, a; int test(int c) c = c + 10; return 1; a = 5; b = test(a); printf("test is %d", b); return 0; int printf(... )..... A Book on C, 4ed. 5-29

제어의흐름 #include <stdio.h> int test(int); int main(void) int b, a; int test(int c) c = c + 10; return 1; a = 5; b = test(a); printf("test is %d", b); return 0; int printf(... )..... A Book on C, 4ed. 5-30

제어의흐름 #include <stdio.h> int test(int); int main(void) int b, a; int test(int c) c = c + 10; return 1; a = 5; b = test(a); printf("test is %d", b); return 0; int printf(... )..... A Book on C, 4ed. 5-31

제어의흐름 #include <stdio.h> int test(int); int main(void) int b, a; int test(int c) c = c + 10; return 1; a = 5; b = test(a); printf("test is %d", b); return 0; int printf(... )..... A Book on C, 4ed. 5-32

값에의한호출 C 에서는값에의한호출로함수를호출함 - 각인자가평가된후, 그값이대응되는형식매개 변수의위치에서지역적으로사용됨 - 변수가함수로전달되어도, 호출한환경에저장된 변수값은변경되지않음 A Book on C, 4ed. 5-33

값에의한호출의예 #include <stdio.h> int compute_sum(int n); int main(void) int n = 3, sum; printf("%d\n", n); // 3 is printed sum = compute_sum(n); printf("%d\n", n); // 3 is printed printf("%d\n", sum); // 6 is printed return 0; int compute_sum(int n) //sum the integers from 1 to n int sum = 0; for ( ; n > 0; --n) //stored value of n is changed sum += n; return sum; A Book on C, 4ed. 5-34

함수호출의의미 1. 인자목록의각수식이평가된다. 2. 필요하다면, 그수식의값이형식매개변수의형으로변환되고, 함수몸체의시작부분에서그값이대응되는형식매개변수에할당된다. 3. 함수의몸체가실행된다. 4. return 문을만나면, 제어는호출한환경으로넘어간다. 5. return 문이수식을가지고있다면, 필요한경우그수식의값이함수의형으로변환된다음그값도호출한환경으로넘어간다. 6. return 문이수식을가지지않는다면, 어떠한유용한값도호출한환경으로리턴되지않는다. 7. return 문이없다면, 제어가함수몸체의끝에도달할경우호출한환경으로넘어간다. 이때아무런값도리턴되지않는다. 8. 모든인자는 " 값에의한호출 " 로넘어간다. A Book on C, 4ed. 5-35

대형프로그램 큰프로그램은별도의디렉토리에.h 파일과.c 파일 로작성됨.h 파일은헤더파일이라고하며, 여기에는프로그램전체에서필요한프로그램구성원소인 #define, #include, 열거형의틀, 구조체와공용체의틀, 다른 프로그래밍구조물, 그리고함수원형들을포함함.c 파일에는함수들을정의함 각.c 파일의제일처음에헤더파일을 include 함 A Book on C, 4ed. 5-36

예제 pgm.h 파일 #include <stdio.h> #include <stdlib.h> #define N 3 void fct1(int k); void fct2(void); void prn_info(char *); main.c 파일 #include "pgm.h" int main(void) char ans; int i, n = n; printf("%s", "This program does not do very much. n" "Do you want more information? "); scanf(" %c", &ans); if (ans == 'y' ans == 'Y') prn_info("pgm"); for (i = 0; i < n; ++i) fct1(i); printf("bye! n"); return 0; A Book on C, 4ed. 5-37

예제 fct.c 파일 #include "pgm.h" void fct1(int n) int i; printf("hello from fct1() n"); for (i = 0; i < n; ++i) fct2(); void fct2(void) printf("hello from fct2() n"); wrt.c 파일 #include "pgm.h" void prn_info(char *pgm_name) printf("usage:%s n n", pgm_name); printf("%s n", "This program illustrates how one can write a program n"); A Book on C, 4ed. 5-38

단정 단정은프로그램을정확히작동하게만들며, 프로그램의작성의도를쉽게이해할수있게해줌 표준헤더파일 assert.h 에있는 assert() 매크로 사용 - assert() 에인자로전달된수식이거짓이면, 시스템은메시지를출력하고프로그램을중단시킴 A Book on C, 4ed. 5-39

단정 예제 int main(void) int a, b, c; scanf("%d%d", &a, &b); c = f(a, b); assert(c > 0); /* an assertion */... A Book on C, 4ed. 5-40

유효범위규칙 기본적인유효범위규칙 - 식별자는그식별자가선언된블록안에서만이용이가능하다 int a = 2; /* outer block a */ printf("%d\n", a); /* 2 is printed */ int a = 5; /* inner block a */ printf("%d\n", a); /* 5 is printed */ /* back to the outer block */ printf(%d\n", ++a); /* 3 is printed */ A Book on C, 4ed. 5-41

유효범위규칙 외부블록이름은내부블록이그것을다시정의하지 않는한, 내부블록에서도유효함 만일다시정의된다면, 외부블록이름은내부블록으 로부터숨겨짐 A Book on C, 4ed. 5-42

유효범위규칙 int a = 1, b = 2, c = 3; printf("%3d%3d%3d\n", a, b, c); // 1 2 3 int b = 4; float c = 5.0; printf("%3d%3d%5.1f\n", a, b, c); // 1 4 5.0 a = b; int c; c = b; printf("%3d%3d%3d\n", a, b, c); // 4 4 4 printf("%3d%3d%5.1f\n", a, b, c); // 4 4 5.0 printf("%3d%3d%3d\n", a, b, c); // 4 2 3 A Book on C, 4ed. 5-43

병렬블록과중첩블록 int a, b;... /* inner block 1 */ float b;... /* int a is known, but not int b */... /* inner block 2 */ float a;... /* int b is known, but not int a */ /* nothing in inner block 1 in known */... A Book on C, 4ed. 5-44

디버깅을위한블록사용 블록은디버깅을위한목적으로많이사용 코드부분에임시로블록을삽입하면, 프로그램의다른부분에영향을주지않는지역변수를사용할수있음 v가이상한값을갖는다고가정 /* debugging starts here */ static int cnt = 0; printf("*** debug : cnt = %d v = %d\n", ++cnt, v); A Book on C, 4ed. 5-45

기억영역클래스 C 의모든변수와함수는두가지속성을가짐 - 형, 기억영역클래스 4 가지기억영역클래스 - 자동, 외부, 레지스터, 정적 대응되는키워드 - auto extern register static A Book on C, 4ed. 5-46

기억영역클래스 auto 함수의몸체에서선언된변수는디폴트로자동 블록안에서선언된변수는묵시적으로자동기억영역클래스임 auto를사용하여기억영역클래스를명시할수도있지만, 보통은사용하지않음 블록을들어갈때, 자동변수들을위해메모리가할당되고, 블록을빠져나갈때, 자동변수가할당받은메모리는회수됨 A Book on C, 4ed. 5-47

기억영역클래스 extern 함수밖에서선언된변수의기억영역클래스는 extern 이것은프로그램이종료될때까지메모리에계속남아있게됨 이러한변수들을외부변수라고함 블록들과함수들간에정보를전달하는방법으로사용 함수밖에서선언된변수들은키워드 extern을사용하지않아도외부기억영역클래스를가짐 외부변수들은자동이나레지스터기억영역클래스를가질수없음 A Book on C, 4ed. 5-48

기억영역클래스 extern #include <stdion.h> int a = 1, b = 2, c = 3; /* global variables */ /* or extern int a = 1, b = 2, c = 3; */ int f(void); /* function prototype */ int main(void) printf("%3d\n", f()); /* 12 */ printf("%3d%3d%3d\n", a, b, c); /* 4 2 3 */ return 0; int f(void) int b, c; /* b and c are local */ a = b = c = 4; return (a + b + c); A Book on C, 4ed. 5-49

기억영역클래스 extern 키워드 extern은컴파일러에게 " 이변수를현재파일이나다른파일에서찾아라 " 라고지시하는것임 /* In file file1.c */ #include <stdio.h> int a = 1, b = 2, c = 3; /* external variables */ int f(void); /* In file file2.c */ int f(void) extern int a; /* look for it elsewhere */ int b, c; int main(void) printf("%3d\n", f()); printf("%3d%3d%3d\n", a, b, c); return 0; A Book on C, 4ed. 5-50 a = b = c = 4; return (a + b + c);

기억영역클래스 extern 함수간에정보를전달하는두가지방법 - 외부변수 - 매개변수메커니즘 함수는외부저장영역클래스를갖음 외부변수예 ) extern double sin(double); - 사용이용이 - 부작용이발생할가능성이있음 extern double sin(double); 매개변수메커니즘 - 코드의모듈성을향상시킴 - 원하지않는부작용의가능성을줄일수있음 - 전역변수변경시, 매개변수 + return 형태를사용하는것이바람직함 함수는외부저장영역클래스를갖음 - 예 ) extern double sin(double); A Book on C, 4ed. 5-51

기억영역클래스 register 기억영역클래스 register는컴파일러에게변수를가능하다면고속메모리레지스터에저장되도록함 한정된자원으로인해할당하지못하면, 이기억영역클래스는디폴트로자동기억영역클래스가됨 이러한변수는사용되기바로전에선언하는것이좋음 ( 일반적으로컴파일러가사용할수있는 reg. 수는한정적임 ) 실행속도증가를위해사용 예 ) register int i; for (i=0; i< LIMIT ; i++).. A Book on C, 4ed. 5-52

기억영역클래스 static 정적선언은두가지중요한용도로사용됨 - 블록에서선언된변수가프로그램이끝날때까지그값을계속유지하도록함 cf. 일반자동변수는블록을나갈때값이소멸되고 다시들어갈때다시초기화됨. - 외부선언과관련된용도 ( 정적외부변수참조 ) A Book on C, 4ed. 5-53

기억영역클래스 static 예제 void f(void) static int cnt = 0; ++cnt ; if (cnt % 2 == 0)... /* do something */ else... /* do something different */ - 함수처음호출시 cnt 는 0 으로초기화됨 - 함수가끝나면 cnt 는메모리에보존되며, 다시호출시초기화되지않음 ( 기존의값을유지 ) A Book on C, 4ed. 5-54

정적외부변수 정적외부구조물은프로그램모듈화에있어서매우중요한개념인비공개를제공함 - 비공개란변수나함수의가시화또는유효범위의제한을의미함 정적외부변수의유효범위는자신이선언되어있는원시파일의나머지부분임 다른파일에서선언된함수가키워드기억영역클래스 extern을사용하여그변수를사용하고자해도사용할수없음 A Book on C, 4ed. 5-55

정적외부변수 의사난수발생기예제 #define INITIAL_SEED 17 #define MULTIPLIER 25173 #define INCREMENT 13849 #define MODULUS 65536 #define FLOATING_MODULUS 65536.0 static unsigned seed = INITIAL_SEED; /* external */ /* but private to this file */ unsigned random(void) seed = (MULTIPLIER * seed + INCREMENT) % MODULUS; return seed; double probability(void) seed = (MULTIPLIER * seed + INCREMENT) % MODULUS; return (seed / FLOATING_MODULUS); A Book on C, 4ed. 5-56

정적외부변수 함수의유효범위제한 - static 함수는자신이선언되있는파일내에서만접근가능 함수정의를비공개모듈로구현하는데유용함 예 ) static int g(void); /*function prototype*/ void f(int a) /*function definition*/. /* g() is available here, but not in other files */ static int g(void) /*function definition*/.. A Book on C, 4ed. 5-57

디폴트초기화 외부변수와정적변수는프로그래머가초기화하지 않아도시스템에의해 0 으로초기화됨 같은방식 : 배열, 문자열, 포인터, 구조체, 공용체 자동변수와레지스터변수는일반적으로시스템에 의해초기화되지않음 A Book on C, 4ed. 5-58

재귀 어떤함수가직접이든간접이든자기자신을호출하는것 #include <stdio.h> int main(void) printf(" The universe is never ending!"); main(); return 0; A Book on C, 4ed. 5-59

재귀 단순한재귀적루틴은일반적인패턴을따름 - 재귀의일반적인패턴에서는기본적인경우와일반적인재귀경우를처리하는코드가있음 - 보통두경우는한변수에의해결정됨 일반적인재귀함수의제어흐름 1. 변수를검사하여기본적인경우인지일반적인경우인지를결정 2. 기본적인경우일때에는더이상재귀호출을하지않고필요한값을리턴 3. 일반적인경우일때에는그변수의값이결국에기본적인경우의값이될수있게하여재귀호출 A Book on C, 4ed. 5-60

재귀 예제코드 int sum(int n) if (n <= 1) return n; /* 기본적인경우 */ else /* 일반적인경우 */ return (n + sum(n - 1)); - 이코드에서는 n 을사용하여두경우를판단 - n 이 1 보다작거나같으면기본적인경우임 n 을리턴 - 아니면일반적인경우임 n 에서 1 을빼어재귀호출 ==> n 에서 1 을뺐기때문에언젠가 n 은 1 보다작거나같아질것임 A Book on C, 4ed. 5-61

재귀의효율성 많은알고리즘은재귀적방식과반복적방식둘다로표현할수있음 전형적으로, 재귀가더간결하고같은계산을하는데더적은변수를필요로함 반면, 재귀는각호출을위한인자와변수를스택에쌓아두어관리하기때문에많은시간과공간을요구함 즉, 재귀를사용할때에는비효율성을고려해야함 그러나일반적으로재귀적코드는작성하기쉽고, 이해하기쉬우며, 유지보수하기가쉬움 A Book on C, 4ed. 5-62

예제 : 하노이탑 P. 235 HW #4 (due date: 4/26) - 3, 5, 8, 12, 18, 20, 27 A Book on C, 4ed. 5-63

질의및응답 - 끝 - A Book on C, 4ed. 5-64