Inflearn brand logo image
Inflearn brand logo image
채널톡 아이콘

인프런 커뮤니티 질문&답변

dbgud85님의 프로필 이미지

작성한 질문수 11

(2025) 일주일만에 합격하는 정보처리기사 실기

함수와 재귀함수 (v2)

39:33 res 리턴값

해결된 질문

작성

·

67

0

너무 잦은 질문 죄송합니다.

몇번을 돌려봐도 리턴이 헷갈리네요

 

재귀함수를 통해 int res = 15 를 구한다음

메인함수에 int sum=nSum(n)에 들어 가는거 같은데

res가 갑자기 nSum에 리턴이 되는걸 어떻게 이해해야

될지 모르겠습니다.

 

첫번째 호출->자기자신 호출까지는 이해했는데

결과값이 리턴하는 순서? 공식?이 잘 정립이 안되네요 ㅠㅠ

답변 2

1

주말코딩님의 프로필 이미지
주말코딩
지식공유자

안녕하세요, 잦은 질문 환영합니다.

얼마든지 더 많이 질문해주세요.

 

설명드리기 전에 팁을 2가지 드립니다.

첫번째는 재귀함수를 해석하실 때는 제일 좋은 것은 쓰면서 하는 것입니다.

실제 시험장에 가시면 시험지 아래에 메모할 수 있는 영역을 줍니다. 거기에 하나씩 쓰면서 하시는 것을 권장드립니다.

 

두번째 팁은 자기자신이 몇 번째 불렸는 지를 적으면서 하면 해석하기 좋습니다.

예를 들어서 함수이름이 func이라고 하면, 제가 오프라인 과외할 때 func1, func2, func3, ... 이렇게 나눠서 쓰라고 합니다.

func1에서 값을 1을 리턴한다면, func2(1) 이런식으로 몇 번 째 불리는지 작성하면서 하다보면 크게 어렵지 않습니다. 재귀함수가 자기 자신을 계속 부른다고 생각하니까 어려운 것인데, 아예 다른 함수를 부른다고 생각하면 쉽게 이해하시더라고요.

 


팁은 위에서 드렸고, 다시 본문으로 돌아오겠습니다.

 

3개만 해보시죠.

nSum에 3이 들어간 겁니다.

그럼 nSum(3)부터 시작합니다.

 

1. 첫번째 시작

if ( 3 == 0 ) -- 거짓 {

실행되지 않음

}

int res = 3 + nSum(2); --- 이 순간에 즉시 nSum(2)를 메모하기 시작합시다.

이 밑의 코드는 아직 동작하지 않음. 왜냐하면 윗 줄이 끝나지 않았기 때문.

 

2. 두번째 시작 (nSum(2)부분 메모)

nSum(2)를 부릅니다.

if문 거짓이므로 통과

 

int res = 2 + nSum(1); -- 이 순간에 nSum(1)을 메모하러 갑니다.

아직 이곳 실행 안됩니다.

 

3. 세번째 시작 (nSum(1) 메모)

if문 거짓이므로 통과

int res = 1 + nSum(0) --- 이 순간 nSum(0) 메모하러 갑니다.

 

4. 네번째 시작 (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 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. dbgud85님.

재귀함수와 관련된 부분이 헷갈리실 수 있습니다. 재귀 함수의 핵심은, 함수가 자기 자신을 호출하여 점점 더 작은 문제로 분할하고, 기본 조건에 도달했을 때 결과를 반환하는 것입니다.

일반적인 재귀 함수의 구조는 다음과 같습니다:

  1. 기저 조건(Base Case): 함수가 더 이상 자기 자신을 호출하지 않고 결과를 직접 반환하는 조건입니다. 이 조건이 없으면 재귀 함수는 무한히 호출되다가 시스템 스택이 넘쳐서 에러를 일으킬 수 있습니다.

  2. 재귀 호출: 함수가 좀 더 작은 입력값으로 자기 자신을 호출하여 문제를 해결합니다.

  3. 결과 반환: 재귀 호출이 끝난 후, 이전 호출 스택으로 돌아가며 결과를 반환합니다.

귀하의 예제에서 int sum = nSum(n)을 호출하면, nSum 함수는 본인이 호출한 순서대로 다시 값을 반환합니다. 즉, 재귀 호출로 쌓인 함수 호출들이 체인처럼 연결되어 맨 마지막 호출의 반환값부터 첫번째 호출까지 차례로 결과를 넘겨주는 형식입니다.

nSum 함수가 15를 리턴하는 과정에서 가장 깊게 호출된 함수가 가장 마지막에 이 리턴 값의 기저 조건을 만족하면서 돌아가고, 이 값을 차례대로 전달하는 과정에서 모든 상위 호출 스택으로 돌아갑니다.

비슷한 질문과 그에 대한 설명들이 있는 링크를 제공하니 참고해 주세요:

재귀 호출의 실행 흐름과 값 반환 과정을 이해하기 위해서는, 각 호출의 입력과 결과를 종이에 써가면서 추적하는 것이 큰 도움이 될 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.