문제: 크기가 n인 정렬된 배열 S에 x가 있는지 결정하라.
입력: 자연수 n, 비내림차순으로 정렬된 배열 S[1...n], 찾고자 하는 항목 x
출력: locationout
x가 배열 S에 있는 경우: x의 위치
x가 배열 S에 없는 경우: 0
찾고자 하는 항목 x = 18일 때, 배열에서 x를 찾는 과정을 그림으로 표현한 것이다.
맨 처음 배열의 중앙에 위치한 25와 비교하고, 18은 25보다 작기 때문에 왼쪽의 서브 배열인 [10 12 13 14 18 20]을 선택한다.
이번에는 서브배열 [10 12 13 14 18 20]의 중앙에 위치한 13과 비교한다. 18은 13보다 크기 때문에 이번에는 오른쪽 서브배열인 [14 18 20]을 선택한다.
[14 18 20]의 중앙에 위치한 18과 비교한다. 우리가 찾고자 하는 항목 x=18과 일치하므로 검색이 종료된다.
index location(index low, index high){
index mid;
if(low > high) return 0;
else{
mid = ┗ (low + high) / 2 ┛; // 정수 나눗셈
if(x == S[mid]) return mid; // x 찾음
else if(x < S[mid]) location(low, mid-1); // 왼쪽 서브 배열 선택
else location(mid+1, high); // 오른쪽 서브 배열 선택
}
}
n, S, x는 각 재귀 호출마다 변하지 않고 유지되는 값이다. 만약 재귀 안에 지역 변수로 만들어서 사용한다면, 재귀 호출할 때마다 스택에 값이 할당되고 메모리가 낭비된다. 따라서 재귀 호출 안에서 바뀌는 값이 아니라면 전역변수로 사용하는 것이 훨씬 효율적이다.