책 내용 질문하기
재귀함수 factorial 함수 예제 중 문의
도서
2021 시나공 정보처리기사 실기
페이지
217
조회수
386
작성일
2021-03-28
작성자
탈퇴*원
첨부파일

페이지 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 호출이 멈출 수 있는지 설명 부탁드립니다.

 

감사합니다.

답변
2021-03-29 10:51:15

안녕하세요 길벗수험서 운영팀입니다.

 

다음 문장으로 인해 재귀함수가 종료되게 됩니다.

 

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) 

· 5MB 이하의 zip, 문서, 이미지 파일만 가능합니다.
· 폭언, 욕설, 비방 등은 관리자에 의해 경고없이 삭제됩니다.