• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

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

21.09.01 11:57 작성 조회수 239

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 으로 출력되지도 않고 어째서 이러는것인지 이유를 알고싶습니다. 그리고 혹시 재가 주석으로 정리한 재귀함수의 팩토리얼 계산법에도 오류가 있는지 알아봐주시길 부탁드립니다.

답변 1

답변을 작성해보세요.

1

codesweaver님의 프로필

codesweaver

2021.09.01

안녕하세요 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);
}

KoKo님의 프로필

KoKo

질문자

2021.09.01

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