인프런 커뮤니티 질문&답변

이승환님의 프로필 이미지
이승환

작성한 질문수

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

9.8 팩토리얼 예제

재귀호출 팩토리얼 질문

작성

·

154

0

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include<ctype.h>

#include<stdbool.h>

#include<stdlib.h>

int fact(int n)//n: parameter

{

int i=1;

int fa = 1;

if (i < n)

{

i++;

fa *= i;

fact(i);

}

return fa;

}

int main()

{

int num = 5;

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

return 0;

}

이렇게 코드를 짜보았는데 재귀함수를 사용할 때 원래변수 n이 아닌 i같은 다른변수를 사용하면 오류가 뜨나요? 컴파일 자체가 안됩니 다 ㅠㅠ

답변 2

0

이승환님의 프로필 이미지
이승환
질문자

와 감사합니다!!!! 

0

안녕하세요.

질문자님 코드는 무한으로 재귀함수만 호출하고 빠져나오지 못하기 때문에 문제가 발생한 것입니다. 재귀함수가 종료되지 않고 무한으로 계속 호출된다는 뜻입니다. (다른 변수 사용 못하는 그런건 없습니다)

질문자님의 코드는 매번 fact 마다 i가 새롭게 정의되고 1로 시작됩니다. 그리고 이를 i++한 후 fact(2)를 호출하고 계세요. 근데 또 재귀로 다음 fact(2)가 호출되면 n = 2 는 되겠지만 i는 새로 선언되서 또 1입니다. 1 < 2 를 만족하고 i는 1증가되서 2가 되고  fact(2)가 또 호출되고... 이게 무한 반복이 되는 상황입니다. 매 호출마다 n은 2로 고정되어 무한으로 fact(2)가 호출되는 코드에요.

재귀적으로 함수들을 호출할땐 언젠간 함수가 꼭 종료되어서 빠져나와야해요! 그래서 종료 조건을 설정해두고 종료 조건에 수렴해가도록 코드를 짜는 것이 중요합니다. 

이승환님의 프로필 이미지
이승환

작성한 질문수

질문하기