2017-10-08 1 views
0

Ich habe die Rekursion untersucht und angefangen, indem ich ein paar einfache Beispiele online durchgesehen habe, diese liefert die max oder min eines unsortierten Arrays.Wie eine äußere Methode auf einer inneren rekursiven Methode ausgeführt wird?

Ich verstehe die Idee, dass rekursive Aufrufe stapeln (ha), dann auf den Basisfall und entwirren rückwärts. In diesem Fall wird die rekursive Methode innerhalb einer Methode aufgerufen, die das Minimum von zwei Zahlen findet, und ich verstehe nicht, wie die min() -Methode für jede der rekursiven Methoden in einer Weise ausgeführt wird, die die Ergebnisse der rekursiven Methoden verknüpft zusammen, um das richtige Ergebnis zu erzielen.

Ich bin durch den Code gegangen, aber es hat mich mehr verwirrt.

Hier ist ein Java-MCVE der rekursiven Funktion und Beispielhaupt:

public static int min(int a, int b){ 
    if (a<b) 
     return a; 
    return b; 
} 
public static int minValue(int arr[], int n){ 
    if(n == 0) 
     return arr[0]; 
    return min(minValue(arr,n-1),arr[n-1]); 
} 
public static void main(String[] args) 
    int[] arr = {30,20,21,5,3}; 
    int minVal = minValue(arr,5); 
    System.out.printf("%d", minVal); 
} 

So wie ich diesen Code Ausführung bin Tracing:

first call, in main: minValue(arr,5) n is 5 
goes to the recursive method: return min(minValue(arr,4),arr{4}), n is 4 
starts to execute min, looks at the first arg 
minValue executes again: return min(minValue(arr,3),arr{3}) n is 3 

...(does this until n==0 is reached) 

then return arr[0] executes and sends "30" back to the int minVal in Main. 

Klar direkt aus der Rückkehr zurück wie diese Haupt ignoriert den Aufbau von Aufrufen auf dem Stapel, die darauf warten, ausgeführt zu werden, und das macht keinen Sinn. Ich fühle mich wie ich vermisse wie min() minVal() arbeitet.

TL; DR Kann mir jemand helfen, die Ausführung von min() auf den minVal() -Aufrufen zu verfolgen?

Antwort

1

dann kehrt arr [0] zurück und sendet "30" zurück zum int minVal in Main.

Hier ist der Fehler. Es kehrt nicht sofort zu main() zurück. Sie gibt es zurück zum vorherigen rekursiven Aufruf, wobei n1 ist.

Dann kann dieser Anruf min(minValue(arr,0),arr[0]) auswerten, da der minValue(arr,0) Aufruf 30 zurückgegeben hat. Er ruft min(30,30) auf und gibt den Wert zurück an den vorherigen rekursiven Aufruf zurück, wobei n2 ist. Jetzt

dass minValue(arr,1) hat 30 zurückgegeben, dieser Aufruf ist in der Lage min(minValue(arr,1),arr[1]) == min(30,20) == 20 zu bewerten und die Rückkehr zum vorherigen rekursiven Aufruf zurück, wo n3 ist.

Und so weiter zurück durch den Stapel in umgekehrter Reihenfolge, bis alle Anrufe abgewickelt haben.

Verwandte Themen