작성
·
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;
}
개인적으로, 재귀함수에 대한 개념을 처음 접하실 때는 직접 꼼꼼히 하나 하나 확인해보는 것이 가장 좋은 학습 방법 같다고 생각하여, 한 단계씩 모두 설명드려보겠습니다.
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 부분의 교수님 설명을 복습해보시는 것을 권장드립니다. 😀👍
또한, 비슷한 내용의 질문인 재귀호출 질문입니다. 의 답변 내용 또한 참고하시면 좋을 것 같습니다. 😀
답변이 되셨길 바라며, 또 궁금하신 점 있으시면 편하게 댓글 남겨주시면 감사하겠습니다. 화이팅!