2016-11-07 5 views
0

Ich mache Rekursion Übungen und ich verstehe die Grundlagen davon. Aber diese eine Übung hat mich feststecken lassen und ich habe keine Ahnung, wie es dazu gekommen ist. Hier ist sie:Rekursion: Wie funktioniert dieses Programm?

public class MinIndex_rec 
{ 
    public static void main(String[] args) 
    { 
     int[] a = {1, -16, -3, 4, -5, -12, -17}; 
     System.out.println("The Min value index is: " + MinIndex(a, a.length - 1)); 
    } 

    public static int MinIndex(int[] x, int n) 
    { 
     if(n == 0) 
     return n; 

     int index = MinIndex(x, n-1); 

     if(x[index]<x[n]) 
     { 
     System.out.println(x[index] + "\t" + x[n] + "\t" + index + "\t" + n); 
     return index; 
     } 

     else 
     return n;  
    } 
} 

Die Ausgabe lautet:

-16 -3 1 2 
-16 4 1 3 
-16 -5 1 4 
-16 -12 1 5 
The Min value Index is: 6 

Ich habe keine Ahnung, wie es kam zu diesem Ausgang. Ich würde mich über jede Hilfe freuen!

Antwort

0

Es geht ungefähr so:

x = {1, -16, -3, 4, -5, -12, -17}; 

MinIndex(x, 6) 
    if(n == 0) => false 
    index = MinIndex(x, 5) 

    if(n == 0) => false 
    index = MinIndex(x, 4) 

    ... 

     index = MinIndex(x, 0)  // this is called when n is 1, x[n] = -16 
     if(n == 0) => true   // True here so return 0 
     => index = 0 
     if(x[0]<x[1]) => false  // False here so return n again to the call 
            // when n was 2 
     => index = 1 
     => if(x[1]<x[2]) => TRUE 
     => System.out.println(-16 + "\t" + -3 + "\t" + 1 + "\t" + 2); 
     ... 
     etc. 
+0

Oh mein Gott, vielen Dank! Dies macht es viel einfacher zu verstehen. Zwei Fragen jedoch, nachdem festgestellt wurde, dass n == 0 falsch ist, warum geht es dann zu (x, 5) usw., bis es 0 erreicht, anstatt weiter zu machen? Und wenn du dann zu x [0] whosbrucewayne

+0

@whosbrucewayne Wenn 'n == 0 'falsch ist, geht es zur nächsten Anweisung im Code, die' int index = MinIndex (x, n-1);' Aufruf von MinIndex mit 'n-1'. Bis 'n == 0' ist wahr und dann wird 'index' dem zurückgegebenen Aufruf zugewiesen. An diesem Punkt ist "index" gleich "0" und "n" gleich "1", also gehen wir zur nächsten Aussage "if (x [0]

+0

@whosbrucewayne Die Funktionsaufrufe werden nach dem rekursiven Aufruf fortgesetzt, aber zuerst wird der rekursive Aufruf abgeschlossen, da die Funktion auf dem Rückgabewert beruht. –

0

Die Methode findet rekursiv das Element mit dem niedrigsten Index im Array.

Die Methode akzeptiert zwei Parameter - das Array und den maximalen zu überprüfenden Index. Dann ruft es sich rekursiv auf der Teilmenge dieses Arrays auf - im Prinzip ein Element kürzer. Es verwendet das Ergebnis, um das Element an der zurückgegebenen Position mit dem Element an der höchsten Position (die nicht in der rekursiven Aufrufauswertung enthalten ist) zu vergleichen. Abhängig davon, ob das Element an der höchsten Position größer ist oder nicht, gibt es die höchste Position als Index des maximalen Elements oder des von der Teilmenge zurückgegebenen ursprünglichen Index zurück.

Die ersten vier Zeilen in dem Beispiel, das Rück nur temporäre Ergebnis, dh die maximale Elementindex für die Teilmenge des ursprünglichen Arrays - das erste Element, ersten drei Elemente, ersten vier Elemente usw.

Diese Debug-Meldung ist nur gedruckt, wenn der höchste Wert sich nicht ändert. In diesem Beispiel druckt es immer 1, da es nur den ersten und den letzten Vergleich ändert.

+0

Vielen Dank für die Antwort! Ich bin noch ein wenig verwirrt, ich denke hauptsächlich von int index = MinIndex (x, n-1). Warum endet es immer 1? – whosbrucewayne

Verwandte Themen