해결된 질문
작성
·
67
답변 2
1
안녕하세요, 잦은 질문 환영합니다.
얼마든지 더 많이 질문해주세요.
설명드리기 전에 팁을 2가지 드립니다.
첫번째는 재귀함수를 해석하실 때는 제일 좋은 것은 쓰면서 하는 것입니다.
실제 시험장에 가시면 시험지 아래에 메모할 수 있는 영역을 줍니다. 거기에 하나씩 쓰면서 하시는 것을 권장드립니다.
두번째 팁은 자기자신이 몇 번째 불렸는 지를 적으면서 하면 해석하기 좋습니다.
예를 들어서 함수이름이 func이라고 하면, 제가 오프라인 과외할 때 func1, func2, func3, ... 이렇게 나눠서 쓰라고 합니다.
func1에서 값을 1을 리턴한다면, func2(1) 이런식으로 몇 번 째 불리는지 작성하면서 하다보면 크게 어렵지 않습니다. 재귀함수가 자기 자신을 계속 부른다고 생각하니까 어려운 것인데, 아예 다른 함수를 부른다고 생각하면 쉽게 이해하시더라고요.
팁은 위에서 드렸고, 다시 본문으로 돌아오겠습니다.
3개만 해보시죠.
nSum에 3이 들어간 겁니다.
그럼 nSum(3)부터 시작합니다.
if ( 3 == 0 ) -- 거짓 {
실행되지 않음
}
int res = 3 + nSum(2); --- 이 순간에 즉시 nSum(2)를 메모하기 시작합시다.
이 밑의 코드는 아직 동작하지 않음. 왜냐하면 윗 줄이 끝나지 않았기 때문.
nSum(2)를 부릅니다.
if문 거짓이므로 통과
int res = 2 + nSum(1); -- 이 순간에 nSum(1)을 메모하러 갑니다.
아직 이곳 실행 안됩니다.
if문 거짓이므로 통과
int res = 1 + nSum(0) --- 이 순간 nSum(0) 메모하러 갑니다.
if문이 참이 되었습니다. 이 자체는 이제 0을 리턴합니다.
자 이제 나(nSum(0)을 부른)는 다시 리턴으로 돌아갑니다. 3번으로 갑니다.
int res = 1 + 0이 됩니다. nSum(0)이 0을 리턴했기 때문입니다.
그럼 res는 1이 되고 다시 2번으로 갑니다. nSum(1)을 불렀기 때문입니다.
2번에서의 res는
int res = 2 + ((1 + 0)) -- 괄호 부분이 nSum(1)의 리턴값입니다.
이제는 1번으로 갑니다. 가장 처음 부분이죠.
int res = 3 + (( 2 + (( 1 + 0 )) )) --- 전체 괄호가 nSum(2)의 리턴값
그래서 최종 res는
3 + 2 + 1 + 0인 6이 됩니다.
그래서 이 경우에는 6으로 리턴을 받습니다.
이해에 도움이 되셨을까요?
0
안녕하세요, 인프런 AI 인턴입니다. dbgud85님.
재귀함수와 관련된 부분이 헷갈리실 수 있습니다. 재귀 함수의 핵심은, 함수가 자기 자신을 호출하여 점점 더 작은 문제로 분할하고, 기본 조건에 도달했을 때 결과를 반환하는 것입니다.
일반적인 재귀 함수의 구조는 다음과 같습니다:
기저 조건(Base Case): 함수가 더 이상 자기 자신을 호출하지 않고 결과를 직접 반환하는 조건입니다. 이 조건이 없으면 재귀 함수는 무한히 호출되다가 시스템 스택이 넘쳐서 에러를 일으킬 수 있습니다.
재귀 호출: 함수가 좀 더 작은 입력값으로 자기 자신을 호출하여 문제를 해결합니다.
결과 반환: 재귀 호출이 끝난 후, 이전 호출 스택으로 돌아가며 결과를 반환합니다.
귀하의 예제에서 int sum = nSum(n)
을 호출하면, nSum
함수는 본인이 호출한 순서대로 다시 값을 반환합니다. 즉, 재귀 호출로 쌓인 함수 호출들이 체인처럼 연결되어 맨 마지막 호출의 반환값부터 첫번째 호출까지 차례로 결과를 넘겨주는 형식입니다.
nSum
함수가 15를 리턴하는 과정에서 가장 깊게 호출된 함수가 가장 마지막에 이 리턴 값의 기저 조건을 만족하면서 돌아가고, 이 값을 차례대로 전달하는 과정에서 모든 상위 호출 스택으로 돌아갑니다.
비슷한 질문과 그에 대한 설명들이 있는 링크를 제공하니 참고해 주세요:
재귀 호출의 실행 흐름과 값 반환 과정을 이해하기 위해서는, 각 호출의 입력과 결과를 종이에 써가면서 추적하는 것이 큰 도움이 될 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.