• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

재귀함수 마지막 코드가 이해가 안갑니다..

21.07.15 09:36 작성 조회수 360

0

int Ss(int ss)

{

    if (ss <= 0)

    {

        return 0;

    }

    else if (ss <= 1)

    {

        return 1;

    }

    else

    {

        const int st = Ss(ss - 1);

        return st + ss;

    }

}

int main()

{

    cout << Ss(10) << endl;

}

/////////////////////////

디버그로 돌려봤는데

Ss(ss =10) 

함수 내부를 실행하게 되고

세번쨰 else문 실행

const int st = Ss(ss - 1); 로 ss는 10 -1 = 9가되고

재귀함수로 인해

Ss(ss =9)로 함수 안에 함수로 들어가게됨

계속 재귀함수가 반복되고 

ss는 1이 된 상태로 재귀함수되서

Ss(ss = 1)이 되서

 

두번쨰 if else문   

else if (ss <= 1){return 1;}가 실행되어 리턴 값 1이 되서

세번쨰 else문으로 들어감

ss는 1이 리턴되어 값이 1인상태고 ss = 1(컴퓨터는 0부터 시작하기에 값은 2) 

ss = 2가 됨

const int st = Ss(ss - 1);

 = Ss(2 -1) = 1이 되고 st = 1이됨

return st + ss; 

= 1 + 2 =3 즉 3이 반환되어 Ss(ss=3)이됨

제가 궁금한건

ss = 10;값이 줄어들고 ss =1;이 되고부터 입니다..

1.왜 여기선 재귀함수가 안되는거죠??

디버그로 보면 return st + ss; 실행되고

else문을 나가고 바로 다시 else문으로 실행이 되던데

이건 재귀함수가 안되고 else문이 반복 실행되고 있는 상태 아닌가요?

2. 왜 st(3) + ss(3) 되는지 모르겠습니다..

Ss(ss=3)된 상태로 다음으로 넘어가면

const int st = Ss(3 -1) st는 2이되서

2+3되서 5가 되어야 하는데 왜 3+3 되는지 모르겠습니다..

제가 아직 if문 동작하는걸 모르는거겠죠??

코드가 쉬울떈 이해가 되는데

코드가 어려워지면 기존에 이해했던것들도

뒤죽박죽 됩니다...다시 처음부터 공부해야 될까요??

답변 1

답변을 작성해보세요.

1

돌머리 님의 프로필

돌머리

2021.07.15

질문을 제대로 이해했는지 모르겠습니다 .  

1. ss가 1일때 왜 재귀함수가 호출되지 않는지 ?

ss값을 넣어주고 ss가 1이 될때까지 재귀함수는 호출되었습니다. 다만 return이 되지 않았을 뿐입니다.

else문이 반복실행 된다고 느낀것이 호출된 함수들이 return되는 부분이라고 생각됩니다 .

2.  왜 st(3) + ss(3) 되는지 모르겠다.

ss가 -1씩 되면서 1까지 도착했다고  했을때,

else if (ss <= 1) return 1; 가 실행됩니다 

따라서 const int st = 1 이되고 ,이때 ss값은 2가 됩니다.

(ss-1을 인자로 넣어 재귀함수를 호출했기 때문에,  실제 ss값은 +1 을 해주어야 합니다.)

그래서 st+ss 값은 3되며 return 3을 수행하면

st값은 3으로 변경되고  ss값은 3이되므로 st+ss =6 이 나옵니다 .

ss값이 3인 이유는  호출되었던 함수들이 return 하기 위해 ss-1 하기전인 원래 ss값을 + 해준다고 생각하면 될 것 같습니다.

 혹시 제가 틀린 부분 있으면 알려주시면 감사하겠습니다 :)

최지로님의 프로필

최지로

질문자

2021.07.15

죄송합니다
그 제가 이해가 잘 안되서요
1번 질문 답해주신

"else문이 반복실행 된다고 느낀것이 호출된 함수들이 return되는 부분이라고 생각됩니다 ."

라는게 이해가 안가서요
그러니까 ss가 10에서 1이 될떄까지 리턴이 안되고 계속 재귀함수만 호출 됬던거라

그 실행이 안된 리턴이 계속 실행 되는거라
else부분이 반복되 보인다고 생각하면 되는건가요?

2번 질문도 이해가 잘 안되는데

else if (ss <= 1) return 1; 가 실행되고

else문이 실행될떄

ss = 1인 상태에서 리턴값을 +1이 되서 ss = 2가 되고

 const int st = Ss(ss(2) - 1) 

return st + ss; 이 부분이 st = 1 + ss =2 = 3이 반환된다는거고

여기까진 제가 이해한게 맞죠??

그리고 저는 계속 재귀함수가 계속 되서

그 후에도 const int st = Ss(ss - 1);가 된다고 생각해서

반환값은 3이되고 ss =2에서 리턴값이 +1이 되서 ss=3이되고

근데 const int st = Ss(ss(3) - 1); 이 부분이 실행되어

st = 2가 되고 ss는 3이 된다고 생각했는데

그게 아니고 반환값이 3이된 후에는 재귀함수가 아닌

리턴이 계속 반복이 되는 거여서 3+3이 되는거다 라고 이해하는게 맞는건가요?

돌머리 님의 프로필

돌머리

2021.07.15

1. 네  맞습니다 .

2. 네 맞습니다.  ss가 1이 될 때까지 const int st = Ss(ss - 1) 이 부분만 수행이 되었습니다 

   즉 함수 호출은 다 수행하였고 return 하는 일만 남았기 때문에 더 이상의 함수 호출은 일어나지 않습니다.

저도 재귀함수가 기억이 안 나 잠깐 보러 왔다가 답글 달게 되었는데 , 혹시 틀린 부분이 있으면 알려주시면 감사하겠습니다 :)   

최지로님의 프로필

최지로

질문자

2021.07.15

아하 그렇군요..

정말 감사합니다!


제가 리턴에 대해서 이해를 제대로 못한거 같습니다..
원래 이런 재귀함수를 했을떄 리턴이 계속 쌓여있다가 실행 되는거였군요..

근데 원래 리턴값이 기존 값의 플러스가 되는건가요??
아님 이건 재귀함수 한정인가요?

돌머리 님의 프로필

돌머리

2021.07.15

기존 값의 플러스가 된다는 의미가 가장 나중에 실행된 함수가 가장 먼저 반환된다는 말이 맞을까요 ?

재귀함수는 가장 나중에 호출된 함수가 가장 먼저 반환이 됩니다. 

반환이 되지 않으면 함수는 끝이 나지 않고 Stack overflow가 발생하게 됩니다.

최지로님의 프로필

최지로

질문자

2021.07.15

const int st = Ss(ss - 1) 이 부분이 실행되서

ss = 1인 상태에서 리턴값을 +1이 되서 ss = 2가 되고

 const int st = Ss(ss(2) - 1) 이 부분에

ss값이 1인데 리턴값이 +1 되서 2가 되었잖아요
이 부분이 자꾸 찜찜합니다..
원래 리턴값이 기존 ss에 +를 해주는건가 해서요

돌머리 님의 프로필

돌머리

2021.07.15

ss-1을 인자로 넣었기 때문입니다. 

ss를 10부터 넣었기 때문에 -1 씩 해주면

10 , 9 ,8,..., 1 까지  수행한 뒤

이제 반환을 위해 함수의 원래 ss값(-1을 하기전 ss값 ) 을 찾아야됩니다.

(call by value 에서는 인자값을 변경한다고 해서 원래 변수의 값이 변하지 않기 때문입니다.)

그러면 ss가 1되었을때의 원래 ss값은 2였고 그 다음은 3, 4,5,6 ... 10까지의 과정을 수행합니다.

const int st = Ss(ss - 1); 

return st + ss;   -  (여기서는 ss의 값들은 ss -1값이 아닌 원래 ss값임)

저도 부족하여 쉽게 설명을 못 드리겠네요..

최지로님의 프로필

최지로

질문자

2021.07.16

아하!!
감사합니다..

귀찮으셨을 질문인데
뭔가 해소가 된거 같습니다! 정말 감사합니다