해결된 질문
작성
·
318
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
안녕하세요 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);
}
자세하고 실용적인 설명에 감사드립니다.