인프런 커뮤니티 질문&답변
return n*recursive_factorial은 뭘 리턴하는거죠?
작성
·
326
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;
}개인적으로, 재귀함수에 대한 개념을 처음 접하실 때는 직접 꼼꼼히 하나 하나 확인해보는 것이 가장 좋은 학습 방법 같다고 생각하여, 한 단계씩 모두 설명드려보겠습니다.
rc_fact(5)호출 ->rc_fact(5)함수가 호출 스택에 쌓입니다.long rc_fact(int n)함수의 인자 값인5가1이상이므로,if (n >= 1)조건문 안으로 진입합니다.return 5 * rc_fact(n - 1)구문이 실행되는 과정에서,rc_fact(4)함수가 호출됩니다.rc_fact(4)호출 ->rc_fact(4)함수가 호출 스택에 쌓입니다.long rc_fact(int n)함수의 인자 값인4가1이상이므로,if (n >= 1)조건문 안으로 진입합니다.return 4 * rc_fact(3)구문이 실행되는 과정에서,rc_fact(3)함수가 호출됩니다.rc_fact(3)호출 ->rc_fact(3)함수가 호출 스택에 쌓입니다.long rc_fact(int n)함수의 인자 값인3이1이상이므로,if (n >= 1)조건문 안으로 진입합니다.return 3 * rc_fact(2)구문이 실행되는 과정에서,rc_fact(2)함수가 호출됩니다.rc_fact(2)호출 ->rc_fact(2)함수가 호출 스택에 쌓입니다.long rc_fact(int n)함수의 인자 값인2가1이상이므로,if (n >= 1)조건문 안으로 진입합니다.return 2 * rc_fact(1)구문이 실행되는 과정에서,rc_fact(1)함수가 호출됩니다.rc_fact(1)호출 ->rc_fact(1)함수가 호출 스택에 쌓입니다.long rc_fact(int n)함수의 인자 값인1이1이상이므로,if (n >= 1)조건문 안으로 진입합니다.return 1 * rc_fact(0)구문이 실행되는 과정에서,rc_fact(0)함수가 호출됩니다.rc_fact(0)호출 ->rc_fact(0)함수가 호출 스택에 쌓입니다.long rc_fact(int n)함수의 인자int n의 값인0이1미만이므로,else구문 안으로 진입합니다.rc_fact(0)함수가return 1로long타입의 값1을rc_fact(1)함수로 반환한 후 호출 스택에서 제거됩니다.이제, 15번 항목의
return 1 * rc_fact(0)이return 1 * 1로 계산되어rc_fact(1)함수가long자료형 값1을rc_fact(2)함수로 반환한 후 호출 스택에서 제거됩니다.이제, 12번 항목의
return 2 * rc_fact(1)이return 2 * 1로 계산되어rc_fact(2)함수가long자료형 값2를rc_fact(3)함수로 반환한 후 호출 스택에서 제거됩니다.이제, 9번 항목의
return 3 * rc_fact(2)이return 3 * 2로 계산되어rc_fact(3)함수가long자료형 값6을rc_fact(4)함수로 반환한 후 호출 스택에서 제거됩니다.이제 6번 항목의
return 4 * rc_fact(3)이return 4 * 6로 계산되어rc_fact(4)함수가long자료형 값24를rc_fact(5)함수로 반환한 후 호출 스택에서 제거됩니다.이제 3번 항목의
return 5 * rc_fact(4)이return 5 * 24로 계산되어rc_fact(5)함수가long자료형 값120을rc_fact(5)함수를 호출한 곳으로 반환한 후 호출 스택에서 제거됩니다.
재귀 함수의 호출에 있어서 각 함수가 호출 스택에 쌓이는 과정과 반환되는 과정에 대해 익숙하지 않으시다면, 강의 9.7 재귀 호출과 스택 의 1:44 부분의 교수님 설명을 복습해보시는 것을 권장드립니다. 😀👍
또한, 비슷한 내용의 질문인 재귀호출 질문입니다. 의 답변 내용 또한 참고하시면 좋을 것 같습니다. 😀
답변이 되셨길 바라며, 또 궁금하신 점 있으시면 편하게 댓글 남겨주시면 감사하겠습니다. 화이팅!





