2016-09-30 10 views
0

Работа над методом, который выбирает опорный элемент для нахождения k-го наименьшего элемента в массиве с использованием медианы алгоритма медианов; Однако это не похоже, чтобы выйти pickCleverPivot после возвращения:Метод не выходит после оператора возврата

return median(A,left,right); 

Если это помогает, предположим, что первоначально осталось 0, право 9, и А {1,2,3,4,5,6 , 7,8,9,10}.

Вот метод:

private static int pickCleverPivot(int left, int right, int[] A){ 

    int index = 0;             
    if((right-left) <= 5){           
     return median(A,left,right); 
    } 

    for(int i = 0; i < (A.length+5-1)/5; i++){  //Ceiling of n/5 = (A.length+5-1)/5). 

     int R = left+4; 
     if(R > right){ 
      R = right;            
     } 

     int med_index = median_index(A,left,R); 

     swap(A, med_index, index); 
     index++; 
     left +=5; 
    } 

    left = 0; 
    return pickCleverPivot(left, left+(A.length+5-1)/5, A); 

} 
+0

Умм, если ваш lft равен 0, а правый - 9, справа - слева = 9 & it> 5, значит, он не войдет в этот оператор возврата, да? Таким образом, это будет продолжаться вплоть до того, где он вызывает median_index и swap, что может быть узким местом. – Foleosy

ответ

2

Там не должно быть никакого способа для вашего кода игнорировать оператор возврата.

Возможно, вы создали бесконечный цикл? Если вы хотите найти ошибку в своем коде, просто добавьте множество заявлений на печать. Например, верните возвращаемые значения всех методов перед их возвратом.

Если вы все еще не можете найти свою ошибку, вы должны опубликовать весь свой код, чтобы мы могли запускать ваш код самостоятельно.

0

Я бы сказал, пойдите для пошаговой отладки, скорее всего, существует бесконечный цикл, который вызывает возврат, чтобы остановить возврат из метода. Или еще, вставьте полный код, я могу попробовать найти ошибку.

0

Я думаю, я нашел кое-что:

Каждый раз, когда вы делаете рекурсивный вызов вашей функции, это с теми же параметрами. (A.length+5-1)/5 остается тем же самым значением, потому что A всегда тот же массив. Поэтому, если оно больше 5, вы никогда не избегаете своей рекурсивной функции, потому что right - left < 5 всегда будет ложным.