인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

chenney님의 프로필 이미지

작성한 질문수

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

함수와 재귀함수 (v2)

59분 14초

해결된 질문

작성

·

167

0

59분 14초까지 따라가서 arr[0]까지 되는건 이해가 가는데 그 뒷부분이 설명이 여러번 다시들어봐도 거기서 길을 잃었어요..

계산을 return줄에서 해서 그 값으로 위로 쭉쭉 올라가면서 계산하는게 맞나요?

59분 42초에서 arr[1] arr[0] 이렇게 적으셨는데

return(arr[size-1]>max)?arr[size-1]:max; 에서 size에 1을 넣으면 배열[0]이 1인건 알겠는데 5(배열[1])가 어디서 어떤식으로 나와서 어떻게 비교가 되는건지 모르겠어요

답변 2

1

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

우선 질문 주신 대로 return은 역순으로 쭉 올라갑니다.

그 과정에서 arr[0] 하고 arr[1]을 가장 먼저 비교합니다.

 

이 둘 중에 큰 것을 리턴합니다.

가장 마지막에는 size가 1이 되었으니 arr[0]이 리턴되신 것은 이해하셨고,

그 바로 위의 직전 호출함수로 가면

return (arr[1] > arr[0]) ? arr[1] : arr[0];이 됩니다.

이 경우에서는 참이기 때문에 arr[1]이 되고 그것의 값은 5가 됩니다.

그렇게 계속 상위에서 본인을 호출한 함수에게 return으로 max값을 돌려줍니다.

 


 

이게 이해가 어려우신 이유는, 가장 먼저 return을 자꾸 계산하려고 해서 그렇습니다.

maxVal이 지금 총 5줄이죠? 첫 줄은 if로 시작하고 마지막 줄은 return으로 시작하는 줄입니다.

 

가장 마지막 줄(return으로 시작하는 곳)은 처음부터 보시는 것이 아닙니다.

왜냐하면 최종 리턴은 첫 리턴이 정해져야지 의미가 있기 때문에 가장 마지막에 보는 것입니다.

 

처음부터 봅시다. 4번째 줄인 int max = maxVal(arr, size-1)이 계속 호출될 겁니다.

왜냐하면 size==1이 될 때까지는 아직 리턴이 이뤄지지 않고 계속 스스로 호출만 하기 때문이죠.

 


계속 줄어들다가 드디어 size가 1이 되었습니다. 이제 return arr[0]을 리턴합니다. 이것의 값은 1이죠

arr[0]이 1이니까요.

그걸 그대로 바로 위의 함수로 가져다 줍니다. 바로 위의 함수는 size가 2였습니다.

와보니

int max = maxVal(arr, 0);
return (arr[1] > max) ? arr[1] : max;

이것을 실행해야합니다.

여기서 maxVal(arr, 0)은 뭐였죠? 방금 우리가 리턴했던 arr[0] 입니다. 값은 1이죠.

그러면 결국 이것은

int max = 1;

return (arr[1] > 1) ? arr[1] : 1; 이 됩니다.

→ (5 > 1) ? 5 : 1;

여기서 리턴은 arr[1]인 5가 리턴됩니다. arr[1]이 더 크니까요.

저 리턴은 다시 상위 함수로 호출됩니다.


 

상위 함수로 갑니다. 그 상위 함수는 size가 3이었습니다.

반복해서

int max = 5;

return (arr[2] > 5) ? arr[2] : 5;가 됩니다.

 

이렇게 계속 위로 가게 되면 가장 마지막 최대의 값이 max라는 변수에 살아남아서 도착합니다.

 

이해에 도움이 되셨을지 모르겠네요.

 

팁을 드리자면,

  1. 처음 계산할 때는 가장 마지막 줄 return은 거들떠보지도 말자. (완전 무시하세요.)

     

  2. 가장 마지막인 탈출조건으로 가서 arr[0]이라는 "최초 리턴값"을 찾았을 때부터 상위 함수에 나를 호출한 곳에 그 리턴값을 가져다가 박아버리자.

     

  3. 그렇게 계속 반복해서 위로 올라가면서 계산하자.

이렇게 하면 시험에서 그 어떤 재귀함수가 나와도 다 맞힐 수 있습니다.

 

0

인프런 AI 인턴님의 프로필 이미지

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

재귀 함수를 사용하여 배열의 요소 중 최대값을 찾는 과정이 혼란스러우셨던 것 같습니다. 이 과정을 이해하는 데 도움이 될 수 있는 몇 가지 핵심 사항을 설명드리겠습니다.

  1. 재귀 호출의 작동 원리: 재귀 함수는 자신을 여러 번 호출하면서 각 단계에서 작업을 수행하고, 마지막에 최종 결과를 얻기 위해 다시 거슬러 올라옵니다. return(arr[size-1]>max)?arr[size-1]:max; 는 이번 호출의 마지막 요소 arr[size-1] 과 현재까지 얻은 최대값 max 를 비교하고, 둘 중 큰 값을 반환하는 조건문입니다.

  2. 배열 요소의 비교: 문제에서는 size 가 줄어들면서 배열의 각 요소를 차례로 비교합니다. 처음엔 배열의 마지막 요소가 arr[size-1] 으로 설정되고, 재귀적으로 이전의 최대값과 비교되며, 이 비교는 배열의 시작점까지 반복됩니다.

  3. 특정 부분 이해하기:

    • return(arr[size-1]>max)?arr[size-1]:max; 에서 size 가 1이라면, 이는 마지막으로 배열의 첫 번째 요소 arr[0] 으로 설정되고 초기 max 값과 비교돼 최종 결과를 반환합니다.
    • 따라서, 배열이 거꾸로 작은 요소에서 큰 요소로 가며 비교가 이루어진다고 볼 수 있습니다.

그래서 arr[1]arr[0] 의 비교가 이루어지고, 최종적으로 재귀 호출의 결과가 최종 반환됩니다.

관련 질문 및 설명

이와 유사한 질문과 답변이 있는 링크들을 소개해드릴 테니 확인해보시면 더 도움이 되실 것입니다:

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

chenney님의 프로필 이미지

작성한 질문수

질문하기