이진 검색 알고리즘을 수행하는 대신 배열을 3 개로 분할하고 3 진 검색 알고리즘을 사용하는 재귀 적 메서드를 작성했습니다. 재귀 사례가 옳다는 것이 상당히 긍정적이지만, 기본 사례에 문제가있는 것 같습니다. 배열에 두 개 이하의 값이 들어있는 경우에 만들어진 기본 경우는 값이 배열에 있고 인덱스를 반환하면 비 재귀 적으로 검사해야합니다. 값을 찾지 못하면 -1을 반환합니다.trinary search에 대한 재귀 메서드 사용
내가 알 수없는 이유로,이 방법은 무엇을 상관없이 -1을 반환합니다. 배열의 크기에 관계없이 또는 배열에 값이 포함되는지 여부. 여기 방법이 있습니다.
public static int trinarySearch(int[] array, int x, int low, int high) {
if (high - low < 3) { //BASE CASE.
for (int i = low; i < high; i++) {
if (array[i] == x) {
return i;
}
}
return -1;
} else { //RECURSIVE CASE.
int firstThird = low + (high - low)/3;
int secondThird = low + 2 * (high - low)/3;
if (x <= array[firstThird]) {
return trinarySearch(array, x, low, firstThird - 1);
} else if (x <= array[secondThird]) {
return trinarySearch(array, x, firstThird + 1, secondThird - 1);
} else { // must be (x > array[secondThird])
return trinarySearch(array, x, secondThird + 1, high);
}
}
}
내 테스트 코드에서 나는 단순히 [] INT 배열 = {1, 2, .....}
이의 내가 INT 2를 검색한다고 가정 해 봅시다, 그리고 같은 배열을 설정하고 배열에 있습니다. 테스트 코드에 배열을 설정하고 메서드를 trinarySearch (array, 2, 0, array.length-1)로 호출합니다. 매번 -1을 인쇄합니다. 메소드에 문제가 있습니까? 아니면 단순히 테스트 코드를 잘못 설정 했습니까?
는 X <= 어레이 테스트가 잘못 보이는 참조
작업 ..... –
이 @MitchWheat 말했듯이, 재귀 경우에 시험은 재귀 호출에 대한 제한과 일치하지 않는 베이스 케이스가 "하이"로 멈추게한다. 재고. 인쇄 문을 몇 개 삽입하거나 디버거를 사용하여 정신 모형의 오류가 어디에 있는지 확인하십시오. – Gene