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

ILLIP님의 프로필 이미지
ILLIP

작성한 질문수

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

9.8 팩토리얼 예제

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

작성

·

291

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이라고 봐야할까요

 

답변 1

2

안녕하세요, 답변 도우미 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 부분의 교수님 설명을 복습해보시는 것을 권장드립니다. 😀👍

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

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

ILLIP님의 프로필 이미지
ILLIP

작성한 질문수

질문하기