페이지 217 에 나와 있는 예제는 아래와 같습니다.
#include <stdio.h>
int factorial(int n) ;
main() {
int (*pf)(int) ;
pf = factorial ;
printf("%d", pf(3)) ;
}
int factorial(int n) {
if (n <= 1)
return 1 ;
else
return n * factorial(n - 1) ;
}
질문은 pf(3) 을 호출하였을때
첫번째 호출 : return 3 * factorial (2)
두번째 호출 : return 3 * (return 2 * factorial (1)) -> 6 * factorial(1)
세번째 호출 : return 3 * (return 2 * (return 1 * factorial (0)) -> 6 * factorial(0)
세번째 호출 : return 3 * (return 2 * (return 1 * (return 1 * factorial (-1)) -> 6 * factorial(-1)
.
.
.
위와 같이 무한대로 재귀호출이 되는 것이 아닌가요?
즉 factorial 함수 호출을 멈추게 하는 제어를 하지 않는데 어떻게 factorial 호출이 멈출 수 있는지 설명 부탁드립니다.
감사합니다.
안녕하세요 길벗수험서 운영팀입니다.
다음 문장으로 인해 재귀함수가 종료되게 됩니다.
int factorial(int n) {
if (n <= 1)
return 1 ;
else
return n * factorial(n - 1) ;
}
위의 빨간 부분은 함수에 인수로 1 이하의 값이 들어오는 경우 재귀(자신을 호출하는)를 멈추고 상수(1)값을 반환함으로써 더 이상 함수가 호출되는 것을 막게 되어있죠.
행복한 하루되세요 :)
-
관리자2021-03-29 10:51:15
안녕하세요 길벗수험서 운영팀입니다.
다음 문장으로 인해 재귀함수가 종료되게 됩니다.
int factorial(int n) {
if (n <= 1)
return 1 ;
else
return n * factorial(n - 1) ;
}
위의 빨간 부분은 함수에 인수로 1 이하의 값이 들어오는 경우 재귀(자신을 호출하는)를 멈추고 상수(1)값을 반환함으로써 더 이상 함수가 호출되는 것을 막게 되어있죠.
행복한 하루되세요 :)
-
관리자2021-04-13 10:52:24
안녕하세요 길벗수험서 운영팀입니다.
.. 어느 위치에서 혼동이 오셨는지 모르겠습니다.
factorial(1)을 호출하게 되는 경우,
이 때 수행 되는 것은, "return 1 * factorial (0)"이 아닌 단순히 "return 1"입니다.
factorial 함수로 제어가 옮겨졌을 때, if문에서 else로 넘어갈 수 없기 때문이죠.
그럼 return이 값을 반환하면서 함수를 종료하는 것이니, 호출되었던 함수가 차례대로 종료되게 됩니다.
행복한 하루되세요 :)
-
*2021-04-10 13:56:37
안녕하세요. 질문 잘 읽어보았습니다.
그런데 제 질문의 요지는
if (n <= 1) return 1 ;
에서 항상 1이 Return 되는 건 알겠는데요.
재귀호출이 멈추는 로직은 어디에서 작동하는지에 대한 질문입니다.
아래와 같이 세번째 이후 무한대로 호출이 가능한데 그걸 멈추는 부분은 어디에서 컨트롤 되는지요?
아님 그런 컨트롤을 안 해도 c 언어에서 무의미한 반복 호출임을 인식하고 멈추게 되는 것인지(c언어에서 제공하는 기능) ?
그럼 답변 기다리겠습니다.
질문은 pf(3) 을 호출하였을때
첫번째 호출 : return 3 * factorial (2)
두번째 호출 : return 3 * (return 2 * factorial (1)) -> 6 * factorial(1)
세번째 호출 : return 3 * (return 2 * (return 1 * factorial (0)) -> 6 * factorial(0)
세번째 호출 : return 3 * (return 2 * (return 1 * (return 1 * factorial (-1)) -> 6 * factorial(-1)