int find_max(int arr[], int n)
{
int a, b;
// 수열의 길이가 1 이면 수열의 값을 return.
if (n == 1) return *arr;
if (n % 2 == 0) {
// n 이 짝수일때. 길이가 n/2 인 두 개의 부분수열로 나눔.
a = find_max(arr, n / 2);
b = find_max(arr + n / 2, n / 2);
}
else {
// n 이 홀수일때. 길이가 (n+1)/2 인 부분수열과
// (n-1)/2 인 부분수열로 나눔.
a = find_max(arr, (n + 1) / 2);
b = find_max(arr + (n + 1) / 2, (n - 1) / 2);
}
// 두 부분수열중 큰 값을 return 한다.
return (a >= b) ? a : b;
}
재귀로 최댓값찾는 함수인데용 수열을 두개로 나눈다 라고되있는데..
a = find_max(arr, (n + 1) / 2);
↑요부분이 어떻게 동작되는지 알려주실수 있을까요.. 부탁드려요잉..
도와조용 ㅠㅠㅠ
넴?
arr[3] = {2, 3, 4}, n = 3 이렇게 준 다음에 손으로 풀어봐. 포인터 모르면 공부하고
수학에서 괄호 많이 나오는 식 풀 때랑 비슷해
인수 arr 왜필요한거?
재귀로도 찾을 수 있네. 쓰레드로 동시에 돌리면 멋질듯
find_max 에 배열을 주고 a가 앞쪽, b가 뒤쪽을 맡습니다. 최종적으론 a가 앞쪽 제일 큰 놈, b가 뒤쪽 제일 큰 놈이 되고 a와 b를 비교합니다. 포인터 쓰는 기술도 좀 나오고..
arr 넘겨주는건 arr을 인수(지역변수)로 처리해야 +n/2 한 부작용이 안 생기니까 그런 듯
b 구하는방식 있자나여 거기 첫번째인수가 의미하는부분이 왜 저렇게되는지 이해가 안가여 ㅜㅜ(arr + (n + 1) / 2, (n - 1) / 2); 이부분.....
이건 댓글로 설명해줘도 이해하기가 힘들것임. 그냥 님이 10칸짜리 배열 하나 만든다음에 위 함수가 하라는데로 연필로 따라가보시져
흑흑 // 그건 배열과 포인터와 관련된 부분을 공부하면 되요. 배열 이름도 포인터인데 저렇게 몇개 더해주면 배열에서 이동을 한다는 연산이 있으니 찾아보세요.
네 감사합니다 ^^