재귀함수 마지막 코드가 이해가 안갑니다..
517
작성한 질문수 35
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
질문을 제대로 이해했는지 모르겠습니다 .
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값을 + 해준다고 생각하면 될 것 같습니다.
혹시 제가 틀린 부분 있으면 알려주시면 감사하겠습니다 :)
0
죄송합니다
그 제가 이해가 잘 안되서요
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이 되는거다 라고 이해하는게 맞는건가요?
0
1. 네 맞습니다 .
2. 네 맞습니다. ss가 1이 될 때까지 const int st = Ss(ss - 1) 이 부분만 수행이 되었습니다
즉 함수 호출은 다 수행하였고 return 하는 일만 남았기 때문에 더 이상의 함수 호출은 일어나지 않습니다.
저도 재귀함수가 기억이 안 나 잠깐 보러 왔다가 답글 달게 되었는데 , 혹시 틀린 부분이 있으면 알려주시면 감사하겠습니다 :)
0
아하 그렇군요..
정말 감사합니다!
제가 리턴에 대해서 이해를 제대로 못한거 같습니다..
원래 이런 재귀함수를 했을떄 리턴이 계속 쌓여있다가 실행 되는거였군요..
근데 원래 리턴값이 기존 값의 플러스가 되는건가요??
아님 이건 재귀함수 한정인가요?
0
기존 값의 플러스가 된다는 의미가 가장 나중에 실행된 함수가 가장 먼저 반환된다는 말이 맞을까요 ?
재귀함수는 가장 나중에 호출된 함수가 가장 먼저 반환이 됩니다.
반환이 되지 않으면 함수는 끝이 나지 않고 Stack overflow가 발생하게 됩니다.
0
const int st = Ss(ss - 1) 이 부분이 실행되서
ss = 1인 상태에서 리턴값을 +1이 되서 ss = 2가 되고
const int st = Ss(ss(2) - 1) 이 부분에
ss값이 1인데 리턴값이 +1 되서 2가 되었잖아요
이 부분이 자꾸 찜찜합니다..
원래 리턴값이 기존 ss에 +를 해주는건가 해서요
0
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값임)
저도 부족하여 쉽게 설명을 못 드리겠네요..
변수가 메모리에 저장되는 것을 알려주는 강의가 어떤강의였죠
1
481
1
메모리 주소 10진수로 출력
1
672
1
클래스 템플릿 특수화에서 boolalpha로 표현된 리턴값에 대해 질문이 있습니다.
1
515
1
여러가지 리턴 타입에 관한 강의가 어떤 걸까요?
1
549
1
메모리 주소에 관한 질분
0
687
1
인터페이스 클래스에서 reportError의 매개변수에 대해 궁금한 것이 있습니다.
0
558
1
형변환 오버로딩에서 const 관련 질문이 있습니다.
0
448
1
Digit 뒤에 reference를 사용하는 이유
0
512
1
4.2 전역 변수, 정적 변수, 내부 연결, 외부 연결
0
325
1
dat파일이...
0
540
1
TODO:대입 연산자 오버로딩에 대한 소스코드입니다.
0
651
1
복사 생성자 관련 질문이 있습니다.
0
456
1
수업 중 궁금한점이 있습니다.
1
392
1
라이브러리자체가 이해가 되지 않습니다.
0
565
1
마지막 예제 질문
0
305
1
증감연산자 위치에 따른 수행 순서 질문입니다.
0
382
1
단항 연산자 오버로딩에서 return 부분에 질문이 있습니다.
1
416
1
friend함수 관련 질문이 있습니다.
0
313
1
operator+ 정의부분에서 궁금한 것이 있습니다.
0
448
1
3분 17초 질문
0
354
1
함수에 값을 대입한다는 개념이 이해가 되지 않습니다.
0
450
1
int getvalue() const에서 const는 왜 뒤에 붙는건가요?
0
453
2
const Something &st에서 const를 빼면 안되나요?
0
304
1
friend함수는 다른 클래스의 멤버함수로 쓸 수 없나요??
1
495
1





