알고리즘
[알고리즘]_순환(Recursion)_3 반복문(Iteration)과 비교
Ellie67
2021. 1. 29. 01:35
부경대학교 권오흠 교수님의 '영리한 프로그래밍을 위한 알고리즘 강좌'
Recursion vs. Iteration
-
모든 순환 함수는 반복문(iterator)으로 변경 가능
-
모든 반복문은 순환 함수로 변경 가능
-
순환함수는 복잡한 알고리즘을 단순하게 표현하는 것이 가능하지만,
-
함수 호출에 따른 오버해드가 있다. (매개변수 전달, 액티베이션 프레임 생성 등)
순환적 알고리즘 설계
-
암시적 매개변수(시작 지점을 암시적으로 0부터라고 하는 것)에서
-
명시적 매개변수(시작과 끝을 정확히 나타내는 것)로 바꾸어라
이진 탐색: Iterator(반복문 버전)
public int binarySearch(int data[], int n, int target) {
int begin = 0, end = n - 1; // 시작과 끝 명시
while(begin<=end) { // 시작이 끝보다 작거나 같을 동안
int middle = (begin+end) / 2;
if(data[middle] == target) // 중간의 값과 타겟이 같으면
return middle; // 중간 인덱스를 리턴
else if(data[middle] > target) // 중간의 값이 타겟보다 크면
end = middle - 1; // 끝은 중간에서 하나 작은 인덱스가 된다.
else // 중간의 값보다 타겟이 더 크면
begin = middle + 1; // 시작 지점이 중간에서 하나 큰 인덱스가 된다.
}
return -1;
}
이진 탐색: Recursive 버전
public int binarySearch(int data[], int target, int begin, int end) {
if(begin > end)
return -1;
else {
int middle = (begin+end)/2;
if(data[middle] == target)
return middle;
else if(data[middle]>target)
return binarySearch(data, target, begin, middle-1); // begin부터 middle-1까지 다시
elsㅁAe
return binarySearch(data, target, middle+1, end); // middle+1부터 end까지 다시
}
}
2-SUM: Iterator(반복문 버전)
배열의 데이터는 오름차순으로 정렬되어 있다고 가정한다.
public boolean twoSum(int data[], int n, int K) {
int begin = 0, end = n-1;
while(begin <= end) {
if(data[begin] + data[end] == K)
return true;
else if(data[begin] + data[end] < K) // 인덱스 end에 있는 값이 가장 큰데도 K보다 작으므로
begin++; // begin을 증가시켜야 한다.
else // 인덱스 begin에 있는 값이 가장 작은데도 K보다 크므로
end--; // end를 줄여야 한다.
}
return false;
}
2-SUM: Recursive 버전
배열의 데이터는 오름차순으로 정렬되어 있다고 가정한다.
public boolean twoSum(int data[], int begin, int end, int K) {
if(begin>=end)
return false;
else {
if(data[begin] + data[end] == K)
return true;
else if(data[begin] + data[end] < K) // 인덱스 end에 있는 값이 가장 큰데도 K보다 작으므로
return twoSum(data, begin+1, end, K); // begin을 증가시켜야 한다.
else // 인덱스 begin에 있는 값이 가장 작은데도 K보다 크므로
return twoSum(data, begin, end-1, K); // end를 줄여야 한다.
}
}