inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

홍정모의 따라하며 배우는 C언어

9.8 팩토리얼 예제

재귀함수의 팩토리얼 작동원리에 대한 질문입니다.

해결된 질문

383

KoKo

작성한 질문수 18

0

#include <stdio.h>
int r_factorial(int n);

int main()
{
	int num;
	printf("Input a integer : ");
	scanf("%d", &num);

	printf("%d\n", r_factorial(num));

	return 0;
}


int r_factorial(int n)
{
	if (n != 0)
	{
		printf("%d ", r_factorial(n - 1)); // 왜 1이 여러번 출력되는 것일까?
		return n * r_factorial(n - 1);
// r_factorial(n) == n*r_factorial(n-1). 즉 r_factorial(n-1)의 값을 알아야 r_factorial(n)값의 반환이 가능.

// 그래서 return을 바로 하지못하고  r_factorial{(n), (n-1), (n-2), ... (1)}의 값을 스택에 임시저장.

// r_factorial(1) == 1*(r_factorial(0) == 1) == 1. 

// r_factorial(1)의 값이 나왔기 때문에 r_factorial{(1), (2), ... (n)}의 값을 차래대로 반환.

// return r_factorial(n-1);은 r_factorial(n)의 값을 구하는데 쓰였기 때문에 함수의 반환값은 r_factorial(n) 1개.
	}
	else if (n == 0)
		return 1;
	else
		return 0;
}

이번 예제를 보고 나름대로 만들고 재귀함수의 원리에 대해서도 나름대로 정리해 보았습니다. 하지만 도저히 이해가 되지않는 부분이 있어 질문 올립니다.

재귀함수의 값을 반환할때 반환값의 변화를 보다 명확히 알고싶어 printf("%d ", r_factorial(n - 1)); 를 팩토리얼 함수에 입력했습니다. 그런대 이를 출력해보면

Input a integer : 3

1 1 1 2 1 1 1 6

처럼 이상하게 반복됩니다. 팩토리얼처럼 1 2 6 으로 출력되지도 않고 어째서 이러는것인지 이유를 알고싶습니다. 그리고 혹시 재가 주석으로 정리한 재귀함수의 팩토리얼 계산법에도 오류가 있는지 알아봐주시길 부탁드립니다.

c

답변 1

1

나무늘보

안녕하세요 KoKo님

우선 1이 계속 출력되는 이유는 아래와 같이 n을 곱하지 않기 때문입니다. 아래와 같이 n 을 곱하여 출력하도록 한다면 원하시는결과에 조금더 근접할거에요.

printf("%d ", n * r_factorial(n - 1));

재귀함수의 작동이 이해되지 않을때는 그림으로 그려가면서 노가다를 하는수밖에 없긴 합니다 :)

그리고 팩토리얼 코드는 조금 더 단순해질 수 있습니다. 

보통 재귀함수는 종료조건을 먼저 작성하신 후 나머지 코드를 작성하시는것이 헷갈리지 않으실거에요.

#include <stdio.h>

int factorial(int);

int main(void) {
    int num;
    scanf("%d", &num);
    
    printf("%d\n", factorial(num));
    return 0;
}

int  factorial(int num) {
    if (num <= 1){ 
        return 1;   
    }
    return num * factorial(num-1);
}

0

KoKo

자세하고 실용적인 설명에 감사드립니다.

Export template 안됨

1

63

2

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

88

3

main 함수에서 왜 int만 선언이 되는걸까요

1

78

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

75

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

78

1

프로토타입과 함수간의 인자 불일치

1

87

2

12.12 헤더 관련 질문

1

74

2

Visual Studio Community 2026 사용 문의

1

170

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

72

2

getchar(), putchar()

1

111

3

강의자리ㅛ

1

93

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

127

2

소스파일안에 여러 파일

1

87

2

F5와 F7의 차이

1

90

2

c = TWO * (a+b); 에서 a와 b는?

1

67

2

; 세미콜론을 붙이는 기준에 문의

1

78

1

Step over 기능 문의

1

64

2

2.6 강의 따옴표 출력 규칙 문의

1

87

2

int main 함수 관련 오류 문의

1

76

2

13.4 words[0]

0

73

2

11.7 함수를 구현해 봤습니다.

1

67

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

71

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

60

2

11.6 fit_str함수를 구현해 봤습니다.

1

59

2