2016-09-30 4 views
0

Arbeiten an einer Methode, die einen Drehpunkt zum Suchen des k-ten kleinsten Elements in einem Array unter Verwendung des Median-Median-Algorithmus auswählt; jedoch scheint es nicht pickCleverPivot nach der Rückkehr zu verlassen:Methode wird nicht nach return-Anweisung beendet

return median(A,left,right); 

Wenn es hilft, setzt voraus, dass zunächst 0 ist links, rechts ist 9 und A {1,2,3,4,5,6 , 7,8,9,10}.

Hier ist die Methode:

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

Umm, wenn Ihr lft 0 ist und rechts ist 9, rechts - links = 9 & es ist> 5, so wird es diese Rückkehr Aussage nicht eingeben, ja? Dann geht es weiter bis zum Median_index und Swap, was der Flaschenhals sein könnte. – Foleosy

Antwort

2

Es sollte keine Möglichkeit, für Ihren Code, eine return-Anweisung zu ignorieren.

Vielleicht haben Sie eine Endlosschleife erstellt? Wenn Sie einen Fehler in Ihrem Code finden möchten, fügen Sie einfach viele Druckanweisungen hinzu. Drucken Sie beispielsweise die zurückgegebenen Werte aller Methoden, bevor Sie sie zurückgeben.

Wenn Sie Ihren Fehler immer noch nicht finden können, sollten Sie Ihren gesamten Code veröffentlichen, damit wir Ihren Code selbst ausführen können.

0

Ich würde sagen, gehen Sie für eine schrittweise Debugging, höchstwahrscheinlich gibt es eine Endlosschleife, die die Rückkehr zu stoppen von der Methode zurückzukehren verursacht. Oder fügen Sie den vollständigen Code ein, ich kann versuchen, den Fehler zu finden.

0

Ich glaube, ich etwas gefunden:

Jedes Mal, wenn Sie einen rekursiven Aufruf an Ihre Funktion machen, ist es mit den gleichen Parametern. (A.length+5-1)/5 bleibt derselbe Wert, weil A immer das gleiche Array ist. Wenn es also größer als 5 ist, entkommt man nie der rekursiven Funktion, weil right - left < 5 immer falsch ist.

Verwandte Themen