Это проблема:
if(a[tmp].compareTo(x)>0)
find(a,x,tmp,high);
else if(a[tmp].compareTo(x)<0)
find(a,x,low,tmp);
Вы должны использовать tmp + 1
в первом случае и tmp - 1
во втором. В противном случае, если у вас есть (скажем) low = 0, high = 1, вы потенциально будете в итоге постоянно звонить с теми же аргументами; tmp
будет равен 0, и если x
больше a[0]
, вы просто позвоните find(a, x, 0, 1)
снова.
Во всяком случае, это мое внутреннее чувство. Вы должны действительно регистрировать то, что происходит с точки зрения используемых низких / высоких значений - я уверен, что вы увидите какое-то повторение, прежде чем оно заработает.
РЕДАКТИРОВАТЬ: Вы также получили сравнение раунд неправильно. a[tmp].compareTo(x)
вернет значение меньше 0, если a[tmp]
меньше x
- т. Е. Вам следует искать позже в массиве, а не раньше.
РЕДАКТИРОВАТЬ: В настоящее время ваш код «выхода с -1» не работает - вы всегда будете возвращать -1, если a[tmp].compareTo(x)
вернет ненулевое значение, которое не выше нуля и не ниже нуля. Я призываю вас найти такое целое число :) (Было бы так же, если бы сравнить, чтобы быть нестабильным, но это отдельная проблема ...)
Один из вариантов - определить, если high == low
- в этот момент, если вы не нажали правильное значение, вы можете вернуть -1:
int comparison = a[tmp].compareTo(x); // Let's just compare once...
if (comparison == 0) {
return tmp;
}
// This was our last chance!
if (high == low) {
return -1;
}
// If a[tmp] was lower than x, look later in the array. If it was higher than
// x, look earlier in the array.
return comparison < 0 ? find(a, x, tmp + 1, high) : find(a, x, low, tmp - 1);