ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C] 재귀함수와 라이브러리 함수
    C 2023. 4. 13. 21:17

     재귀함수와 라이브러리 함수


     

     

    재귀 함수(recursive function)

    • 함수구현에서 자신의 함수를 호출하는 함수
    • 재귀적 특성을 표현하는 알고리즘에서 재귀 함수를 이용하면 문제를 쉽게 해결

     

     

    함수 factorial(3)을 호출한 경우 실행 과정

    • factorial(3)을 호출하면 함수 factorial(3) 내부에서 다시 factorial(2)를 호출한다.
    • factorial(2)에서는 다시 factorial(1)을 호출한다.
    • factorial(1) 내부에서 return 1을 실행하면 다시 factorial(2)로 돌아와 반환값 1을 이용하여 return(2*1)을 실행한다.
    • 계속해서 factorial(3)으로 돌아오 factorial(2)의 결과값인 2를 이용하여 factorial(3*2)를 실행하면 결국 6을 반환단다.
    • 즉 3!의 결과 6을 얻을 수 있다.
    # n! = n * (n-1)!
    
    int factorial(int num)
    {
    	if(num <= 1)
        	return 1;
        else
        	return (num * factorial(num - 1));
    }

     

     

     

    재귀함수 단점

    • 재귀함수는 함수의 호출이 계속되면 시간도 오래 걸리고 메모리의 사용도 많다는 단점이 있다.
    • 그러므로 재귀함수의 이용이 효율적이지 않고, 반복 구문으로 비슷한 난이도로 구현이 가능하다면 반복문을 이용하는 것이 바람직하다.

     


     

    난수 라이브러리 함수

    • 난수 (random number)  
      • 특정한 나열 순서나 규칠을 가지지 않는 연속적인 임의의 수
      • 임의의 수란, 어느 수가 반환될 지 예측할 수 없으며 어느 수가 선택될 확률이 모두 동일하다는 의미

     

    함수 rand()

    • 로또 프로그램 등 임의의 수가 필요로 하는 다양한 프로그래밍에 활용
    • 함수원형은 헤더파일 stdlib.h(standard library)에 정의
    • 0에서 32767 사이의 정수 중에서 임의로 하나의 정수를 반환
    • 함수 rand()는 함수호출 순서에 따라 항상 일정한 수가 반환 (항상 41, 18467, 6334, 26500, 19169 등의 값들이 출력)
    • 매번 난수를 다르게 생성하려면 시드(seed) 값을 이용
      • 시드 값이란, 난수를 다르게 만들기 위해 처음에 지정하는 수로서 시드 값이 다르면 난수가 달라짐
      • srand(seed)를 호출
      • 먼저 서로 다른 시드 값인 seed를 이용
      • 항상 서로 다른 seed 값을 지정하기 위해 현재 시간의 함수 time()을 이용
      • 함수 time(NULL)은 1970년 1월 1일 이후 현재까지 경과된 시간을 초 단위로 반환
      • 함수 time()을 이용하기 위해 헤더파일 time.h 삽입
      • 난수에 시드를 지정하기 위해 함수 srand((long) time(NULL)) 호출
      • 1에서 n까지의 난수를 발생시키려면 함수 rand()를 이용하여 수식 rand() % n + 1을 이용
      • 이후 부터 함수 rand()로 난수를 생성하면 서로 다른 난수를 만들 수 있다.

     

    #include <stdlib.h>		// rand(), srand()를 위한 헤더파일 포함
    #include <time.h>		// time()을 위한 헤더파일 포함
    
    #define MAX 100
    
    int main(void) {
    	···
    	srand((long)time(NULL));	# time(NULL) 값을 인자로 srand()를 호출
    	···
    		number = rand() % MAX + 1;	# 1에서 MAX까지 하나의 난수가 생성
    	···
    }

     

    ※ srand로 시드 값을 먼저 지정한 후 1~100 사이의 난수를 생성
    
    #include <stdio.h>
    
    #include <stdlib.h>		// rand(), srand()를 위한 헤더파일 포함
    #include <time.h>		// time()을 위한 헤더파일 포함
    
    #define MAX 100
    
    int main(void) {
    
        long seconds = (long)time(NULL);	# 변수 seconds를 선언하면서 라이브러리 time()을 호출하여 그 결과를 저장
        srand(seconds);		        # 변수 seconds를 실매개변수로 함수 srand(seconds)를 호출
    
        printf("1 ~ %5d 사이의 난수 8개:\n", MAX);
        for (int i = 0; i < 8; i++) 
            printf("%5d ", rand() % MAX + 1);
        puts("");
    
        return 0;
    }
    1 ~   100 사이의 난수 8개:
       23    36    66     4    65    64     9     3

     

     


     

     

     

    math.h

    • 수학 관련 함수를 사용하려면 헤더파일 math.h을 삽입해야 한다.
    함수 처리작업
    double sin(double x) 삼각함수 sin
    double cos(double x) 삼각함수 cos
    double tan(double x) 삼각함수 tan
    double sqrt(double x) 제곱근, square root(x)
    double exp(double x) 지수함수, e^x
    double log(double x) 자연로그
    double log10(double x) 상용로그
    double pow(double x) 제곱근
    double ceil(double x) x보다 작지 않은 가장 작은 정수(천정 값)
    double floor(double x) x보다 크지 않은 가장 큰 정수(바닥 값)
    int abs(int x) 정수 x의 절대 값
    double fabs(double x) 실수 x의 절대 값

     


     

    다양한 헤더파일

    헤더파일 처리 작업
    stdio.h 표준 입출력 작업
    math.h 수학 관련 작업
    string.h 문자열 작업
    time.h 시간 작업
    ctype.h 문자 관련 작업
    stdlib.h 여러 유틸리티(텍스트를 수로 변환 등) 함수

     

     

     

    'C' 카테고리의 다른 글

    [C] 변수 유효범위②  (0) 2023.05.02
    [C] 변수 유효범위①  (0) 2023.04.26
    [C] 함수  (0) 2023.04.13
    [C] 배열②  (0) 2023.04.11
    [C] 배열①  (0) 2023.04.05
Designed by Tistory.