inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

9.8 팩토리얼 예제

return n*recursive_factorial은 뭘 리턴하는거죠?

337

ILLIP

작성한 질문수 7

1

long rc_fact(int n)

{

if (n >= 1)

{

return n * rc_fact(n - 1); // tail recursion

else return 1;

}

저는 recursive_factorial을 그냥 rc_fact로 줄여서 했습니다

루프를 활용한 팩토리얼은 맞췄는데 그땐 결과값을 ans에 리턴한다해서 return ans;라고 하신게 이해가 잘 되었습니다.

근데 return n * rc_fact(n - 1) 여기가 이해가 안됩니

n에 5라는 값이 들어오고 5>1이므로 if 안으로 들어갈 텐데 뭘 반환해서 어디에 집어넣는다는건가요?

 

5*rc_fact(4)라는 값을 다시 int n에 집어넣겠다는건가요?

그리고 안에 다시 꿈속의 꿈처럼 rc_fact(4)를 진행하고 그 rc_fact(4)에선 또 4*rc_fact(3)을 반환하고 반복하는 것이라고 이해를 했습니다.

 

하지만 어떤 값을 어디로 return 하겠다는 것인지는 아직 이해를 못했습니다. 이 rc_fact(5) 함수의 결과값이 5*rc_fact(4)인건가요?

 

즉 최종적으로 rc_fact(5) 함수의 결과값이 바로

5*4*3*2*1*rc_fact(0)이 되어서 120이라고 봐야할까요

 

c

답변 1

2

Soobak

안녕하세요, 답변 도우미 Soobak 입니다.

질문해주신 코드를 바탕으로 자세히 설명드려보겠습니다.

long rc_fact(int n)
{
  if (n >= 1)
  {
    return n * rc_fact(n - 1); // tail recursion
  }
  else return 1;
}

개인적으로, 재귀함수에 대한 개념을 처음 접하실 때는 직접 꼼꼼히 하나 하나 확인해보는 것이 가장 좋은 학습 방법 같다고 생각하여, 한 단계씩 모두 설명드려보겠습니다.

  1. rc_fact(5) 호출 -> rc_fact(5) 함수가 호출 스택에 쌓입니다.

  2. long rc_fact(int n) 함수의 인자 값인 51 이상이므로, if (n >= 1) 조건문 안으로 진입합니다.

  3. return 5 * rc_fact(n - 1) 구문이 실행되는 과정에서, rc_fact(4) 함수가 호출됩니다.

  4. rc_fact(4) 호출 -> rc_fact(4) 함수가 호출 스택에 쌓입니다.

  5. long rc_fact(int n) 함수의 인자 값인 41 이상이므로, if (n >= 1) 조건문 안으로 진입합니다.

  6. return 4 * rc_fact(3) 구문이 실행되는 과정에서, rc_fact(3) 함수가 호출됩니다.

  7. rc_fact(3) 호출 -> rc_fact(3) 함수가 호출 스택에 쌓입니다.

  8. long rc_fact(int n) 함수의 인자 값인 31 이상이므로, if (n >= 1) 조건문 안으로 진입합니다.

  9. return 3 * rc_fact(2) 구문이 실행되는 과정에서, rc_fact(2) 함수가 호출됩니다.

  10. rc_fact(2) 호출 -> rc_fact(2) 함수가 호출 스택에 쌓입니다.

  11. long rc_fact(int n) 함수의 인자 값인 21 이상이므로, if (n >= 1) 조건문 안으로 진입합니다.

  12. return 2 * rc_fact(1) 구문이 실행되는 과정에서, rc_fact(1) 함수가 호출됩니다.

  13. rc_fact(1) 호출 -> rc_fact(1) 함수가 호출 스택에 쌓입니다.

  14. long rc_fact(int n) 함수의 인자 값인 11 이상이므로, if (n >= 1) 조건문 안으로 진입합니다.

  15. return 1 * rc_fact(0) 구문이 실행되는 과정에서, rc_fact(0) 함수가 호출됩니다.

  16. rc_fact(0) 호출 -> rc_fact(0) 함수가 호출 스택에 쌓입니다.

  17. long rc_fact(int n) 함수의 인자 int n 의 값인 01 미만이므로, else 구문 안으로 진입합니다.

  18. rc_fact(0) 함수가 return 1long 타입의 값 1rc_fact(1) 함수로 반환한 후 호출 스택에서 제거됩니다.

  19. 이제, 15번 항목의 return 1 * rc_fact(0)return 1 * 1 로 계산되어 rc_fact(1) 함수가 long 자료형 값 1rc_fact(2) 함수로 반환한 후 호출 스택에서 제거됩니다.

  20. 이제, 12번 항목의 return 2 * rc_fact(1)return 2 * 1 로 계산되어 rc_fact(2) 함수가 long 자료형 값 2rc_fact(3) 함수로 반환한 후 호출 스택에서 제거됩니다.

  21. 이제, 9번 항목의 return 3 * rc_fact(2)return 3 * 2 로 계산되어 rc_fact(3) 함수가 long 자료형 값 6rc_fact(4) 함수로 반환한 후 호출 스택에서 제거됩니다.

  22. 이제 6번 항목의 return 4 * rc_fact(3)return 4 * 6 로 계산되어 rc_fact(4) 함수가 long 자료형 값 24rc_fact(5) 함수로 반환한 후 호출 스택에서 제거됩니다.

  23. 이제 3번 항목의 return 5 * rc_fact(4)return 5 * 24 로 계산되어 rc_fact(5) 함수가 long 자료형 값 120rc_fact(5) 함수를 호출한 곳으로 반환한 후 호출 스택에서 제거됩니다.

 

재귀 함수의 호출에 있어서 각 함수가 호출 스택에 쌓이는 과정과 반환되는 과정에 대해 익숙하지 않으시다면, 강의 9.7 재귀 호출과 스택1:44 부분의 교수님 설명을 복습해보시는 것을 권장드립니다. 😀👍

또한, 비슷한 내용의 질문인 재귀호출 질문입니다. 의 답변 내용 또한 참고하시면 좋을 것 같습니다. 😀

답변이 되셨길 바라며, 또 궁금하신 점 있으시면 편하게 댓글 남겨주시면 감사하겠습니다. 화이팅!

Export template 안됨

1

45

2

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

1

70

3

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

1

63

2

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

1

62

2

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

1

58

1

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

1

81

2

12.12 헤더 관련 질문

1

63

2

Visual Studio Community 2026 사용 문의

1

149

2

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

1

65

2

getchar(), putchar()

1

96

3

강의자리ㅛ

1

85

2

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

1

119

2

소스파일안에 여러 파일

1

80

2

F5와 F7의 차이

1

82

2

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

1

63

2

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

1

72

1

Step over 기능 문의

1

57

2

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

1

81

2

int main 함수 관련 오류 문의

1

71

2

13.4 words[0]

0

64

2

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

1

65

2

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

1

67

2

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

1

57

2

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

1

56

2