해결된 질문
작성
·
167
답변 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라는 변수에 살아남아서 도착합니다.
이해에 도움이 되셨을지 모르겠네요.
팁을 드리자면,
처음 계산할 때는 가장 마지막 줄 return은 거들떠보지도 말자. (완전 무시하세요.)
가장 마지막인 탈출조건으로 가서 arr[0]이라는 "최초 리턴값"을 찾았을 때부터 상위 함수에 나를 호출한 곳에 그 리턴값을 가져다가 박아버리자.
그렇게 계속 반복해서 위로 올라가면서 계산하자.
이렇게 하면 시험에서 그 어떤 재귀함수가 나와도 다 맞힐 수 있습니다.
0
안녕하세요, 인프런 AI 인턴입니다. chenney님.
재귀 함수를 사용하여 배열의 요소 중 최대값을 찾는 과정이 혼란스러우셨던 것 같습니다. 이 과정을 이해하는 데 도움이 될 수 있는 몇 가지 핵심 사항을 설명드리겠습니다.
재귀 호출의 작동 원리: 재귀 함수는 자신을 여러 번 호출하면서 각 단계에서 작업을 수행하고, 마지막에 최종 결과를 얻기 위해 다시 거슬러 올라옵니다. return(arr[size-1]>max)?arr[size-1]:max;
는 이번 호출의 마지막 요소 arr[size-1]
과 현재까지 얻은 최대값 max
를 비교하고, 둘 중 큰 값을 반환하는 조건문입니다.
배열 요소의 비교: 문제에서는 size
가 줄어들면서 배열의 각 요소를 차례로 비교합니다. 처음엔 배열의 마지막 요소가 arr[size-1]
으로 설정되고, 재귀적으로 이전의 최대값과 비교되며, 이 비교는 배열의 시작점까지 반복됩니다.
특정 부분 이해하기:
return(arr[size-1]>max)?arr[size-1]:max;
에서 size
가 1이라면, 이는 마지막으로 배열의 첫 번째 요소 arr[0]
으로 설정되고 초기 max
값과 비교돼 최종 결과를 반환합니다.그래서 arr[1]
과 arr[0]
의 비교가 이루어지고, 최종적으로 재귀 호출의 결과가 최종 반환됩니다.
이와 유사한 질문과 답변이 있는 링크들을 소개해드릴 테니 확인해보시면 더 도움이 되실 것입니다:
저는 질문자님의 이해를 돕고자 지식 공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.