public class Interpolation_search {
public static void main(String...s) {
int rr[]= {1,2,3,4,9,10,15,80};
System.out.println(search(rr,0,7,3));
}
static int search(int ar[], int lo, int hi,int X) {
if (lo<hi&&ar[lo]!=ar[hi]) {
int mid=lo + ((hi-lo)/(ar[hi]-ar[lo]))*(X-ar[lo]);
if (X==ar[mid])
return 1; //l1
else if (X>ar[mid])
search(ar,mid+1,hi,X);
else search(ar,lo,mid-1,X);
}
return 0; //l2
}
}
return выполняется дважды: сначала на l1, а затем на l2.
Если вы вызов несколько раз (что вы делаете), он будет возвращение несколько раз.
Не связано: пожалуйста, избегайте имен собственных. Переменные не должны быть сокращениями, они всегда идут в нижнем регистре. И они должны что-то значить. Итак, valueToFind вместо X, и values вместо ar, и «testValues» вместо rr.
Я ценю быстрое возвращение!




Похоже, у вас возникли трудности с пониманием рекурсии.
Ваш метод search() должен возвращать результат типа int. А сам метод многократно вызывает сам (используя разные аргументы). Дело в том, что вы все игнорирование этих рекурсивных вызовов.
Другими словами: настоящий ответ для вас - сделать шаг назад и понять, что такое рекурсия, как имел ввиду, и как его правильно использовать. Для начала вы можете попробовать изменить
search(ar,mid+1,hi,X);
к
return search(ar,mid+1,hi,X);
Вы рекурсивно вызываете метод
search(), поэтому он выполняется несколько раз. При необходимости используйте пошаговый отладчик для визуализации процесса. Также обратите внимание, что вам, вероятно, следует вернуть результат этих рекурсивных вызовов или вообще что-то с ними сделать.