본문 바로가기
쿤즈 Dev/C

[C언어 문제] Factorial(팩토리얼: 계승) 구하기 (재귀 함수 이용)

by :)Koon 2021. 4. 20.

지난 포스팅에서는 Factorial을 구하기 위해서 반복문을 사용했습니다. 그리고 살짝 언급은 해드렸었지만 반복문 말고도 재귀 함수를 이용해서 프로그래밍도 가능합니다.

 

 

이번 포스팅에서는 재귀함수를 이용해서 Factorial을 구해보도록 하겠습니다.


C언어 문제. 재귀함수를 이용해서 Factorial 구하기

화면에 다음과 같이 출력되도록 프로그래밍하시오.

양의 정수를 입력하세요 : -1
양의 정수가 아닙니다.
양의 정수를 입력하세요 : 5
5! = 120

조건 1. 양의 정수(자연수)를 입력받도록 합니다. 양의 정수가 아닐 경우 다시 입력받습니다.

조건 2. 재귀함수를 이용하기

 

*프로그래밍 의도

정수형 변수를 선언할 수 있는가?

연산자를 사용할 수 있는가?

재귀 함수를 사용할 수 있는가?

조건문을 사용할 수 있는가?

 

*문제 해결을 위한 글

2020.08.04 - [쿤즈 Dev/C] - [C언어] 데이터 타입(Data Types) 과 함께 변수 선언하기

2020.08.07 - [쿤즈 Dev/C] - [C언어] 연산자의 종류에 대해서 알아보자

2020.08.10 - [쿤즈 Dev/C] - [C언어] 조건문을 사용해서 분기시켜보자(1) - if 조건문!

2020.10.12 - [쿤즈 Dev/C] - [C언어] 재귀함수! 반복문 없이 반복되는 함수 만들기


C언어 문제 풀이

작성된 프로그래밍은 정답이 아닙니다. 프로그래밍 소스에 대해 정답은 없습니다. 다양한 방법으로 프로그래밍이 가능하며 한 가지 예일 뿐입니다.

소스코드 1. test.c

#include <stdio.h>

int factorial(int);

int main() {
    int num;

    while (1) {
        printf("양의 정수를 입력하세요 : ");
        scanf("%d", &num); //  windows는 scanf_s

        if (num <= 0) {
            printf("양의 정수가 아닙니다.\n");
            continue;
        }

        printf("%d! = %d\n", num, factorial(num));
        break;
    }
    return 0;
}

int factorial(int num) {
    if (num > 1)
        return num * factorial(num - 1);
    else
        return 1;
   
}

 

* 프로그래밍 의도 파악

정수형 변수를 선언할 수 있는가?

값을 저장하기 위해서는 반드시 변수를 설정해야 합니다. 변수는 메모리 공간을 할당받아서 값을 저장할 수 있습니다. 위 프로그래밍에서는 정수형 변수를 사용자로부터 받기 위해서 int 자료형 타입으로 선언하였습니다.

 

연산자를 사용할 수 있는가?

연산자는 종류가 매우 다양합니다. 산술 연산, 논리 연산, 대입 연산 등 여러 가지 연산자의 사용이 익숙해야 계산을 처리할 수 있습니다.

 

재귀 함수를 사용할 수 있는가?

재귀 함수는 필요에 따라 사용할 수 있습니다. 다만 함수의 반복적인 사용으로 반복문보다는 느리게 동작할 수 있기 때문에 비중은 반복문을 더 많이 사용할 수도 있습니다. 재귀함수 내부에서는 이 함수를 종료하기 위해서 반드시 조건문이 필요합니다.

 

조건문을 사용할 수 있는가?

조건문은 true 혹은 false를 구분할 경우에 사용합니다. 혹은 여러 가지 조건에 대해서 판단을 하기 위해서 조건문을 사용합니다. 조건문에 따라서 결과가 달라지기 때문에 다양한 조건에 맞춰서 조건문을 사용할 수 있습니다.


이번 포스팅에서는 앞선 포스팅에서 다뤄보았던 Factorial을 구하기 위해서 반복문이 아닌 재귀 함수를 이용해서 프로그래밍을 해보았습니다. 위에서 말씀드렸듯 프로그래밍에서 과정의 정답은 없습니다. 다만 더 효율적으로 프로그래밍을 하실 수는 있습니다. 도움이 되셨으면 합니다. 이상입니다.

댓글