leedh2004   3년 전

우선 간단한 코드를 먼저 예시로 써보겠습니다.

int recursive(int n){

    if(n<10)

        recursive(++n)

    if(n==10)

        return n;

    return n;

}

int main(){

    cout << recursive(0) <<endl;

    return 0;

}


이렇게 하면 1이 출력되잖아요??

근데 제 생각대로라면 재귀함수에서 recursive(10)까지 간 뒤, if(n==10)을만나 10 도 반환할텐데

이 반환된 값은 어디로 가는거죠??

10을 반환한뒤에 다시 9로 가서 9반환, 8로 가서 8반환.. 이렇게뒤로가서 마지막으로 1반환될 때 그 값만 반환해주는건가요..? 

chogahui05   3년 전

무슨 의도로 코드를 작성하셨는지는 모르겠네요.

일단 재귀함수는 이런식으로 동작할 거 같네요.


n이 들어오는데. n이 10이하면.

(1) 먼저 n을 증가시키고 나서

(2) 재귀함수를 다시 호출하네요.


재귀함수를 R이라고 해 볼게요.

그러면

R(0) ====

n=0. ++연산자로 인해 R(0) 안에 있는 n은 1이 됨.

R(1) ====

n=1. ++연산자로 인해 R(1) 안에 있는 n이 2가 됨.

...

R(9) ====

n=10. ++연산자로 인해 R(9) 안에 있는 n이 10이 됨.

R(10) ====

n이 10이므로 리턴 10.


R(10)이 10을 뱉어낼 때부터가 중요한데요.

R(9)에서, R(9)안에 있는 n이 10이므로 리턴 10이 수행이 되긴 합니다. 즉, if(n==10) 블라블라가 총 2번 수행되고요.

재귀함수에 의해 리턴된 값을 호출한 Caller에서 쓰지 않았으므로, 그건 버려지는 것이지요.

djm03178   3년 전

recursive에 있는 n이 다 똑같은 n이 아닙니다. 재귀호출도 포함하여 매번 호출될 때마다 별개의 n이 새로 만들어지는 거죠. 새로 만들어진 n은 그 호출 내에서만 의미가 있고, 함수가 종료된 후에는 사라집니다. 이 때 반환한 값을 호출한 함수가 받아서 사용하지 않으면 그냥 없어지는 거죠. 즉 호출 자체가 아무 의미가 없어집니다.

댓글을 작성하려면 로그인해야 합니다.