2017-02-16 5 views
-2

hier das Problem Anforderungseltsame Logik Zahlen drucken rückwärts

ein Verfahren writeNums schreiben, die einen ganzzahligen Parameter n annimmt und drucken die ersten n ganzen Zahlen mit 1 in sequentieller Reihenfolge beginnend, durch Kommas getrennt. Die folgenden Aufrufe erzeugen beispielsweise die folgende Ausgabe:

Anrufausgabe writeNums (5); 1, 2, 3, 4, 5

Und hier ist eine Lösung (Teilweise ist es meine Arbeit und teilweise habe ich online gesucht). Was ich nicht verstehe, ist warum diese Zeile writeNums (n - 1); die Zahlen rückwärts drucken? Es ist ein wenig verwirrend, weil ich erwarte das gedruckt zu bekommen: 5,4,3,2,1

public class WriteNums 
{ 
public static void main(String args[]) 
{ 
WriteNums wn=new WriteNums(); 
wn.writeNums(5); 
} 

public static void writeNums(int n) { 
    if (n == 1) 
     System.out.print("1"); 
    else { 
     System.out.println(n); 
     writeNums(n - 1); 
     System.out.print(", " + n); 
    } 
    } 

} 
+0

Blick in Rekursion und Stack auch der rekursiven Aufrufe – Coder

+0

Was bedeutet der Debugger zeigen Sie, wenn Sie Schritt durch den Code? –

+0

Wenn die Nummer nicht 1 ist, ruft sie writeNum (n-1) auf, aber warum druckt system.out in umgekehrter Reihenfolge? –

Antwort

2

sein, weil Sie die Rekursion verwenden und die Ausgabe, die Sie nach dem Funktionsaufruf gedruckt ist.

machen es vor Anruffunktion und Sie werden 5, 4, 3, 2, 1

wie diese:

public static void writeNums(int n) { 
    if (n == 1) 
     System.out.print("1"); 
    else { 
     System.out.print(n+", "); 
     writeNums(n - 1); 
     //System.out.print(", " + n); 
    } 
    } 
+0

danke! Ich denke, dass Ihre Antwort ziemlich meine Verwirrung gelöst hat. Ich werde meine Rekursionsfähigkeiten jetzt bürsten –

+0

froh, um zu helfen!, ich weiß Rekursion kann manchmal verwirrend sein. –

+0

können Sie es bitte als Ihre Antwort akzeptieren? –

0

Das Programm die Zahlen druckt rückwärts, weil Sie es zu drucken fragen die Zahlen rückwärts. Sehen Sie, dass die erste Iteration in Ihren rekursiven Aufrufen zuerst n drucken und dann mit n-1 beginnen. Wenn Sie die Zahlen in aufsteigender Reihenfolge drucken wollen, ändern Sie Ihre Methode, um so etwas wie folgt vor:

public static void writeNums(int m, int n) { 
    if(n < 1) return; 
    System.out.print(m); 
    if(m == n) return; 
    writeNums(m+1, n); 
    } 

Und dann von Ihrem Hauptverfahren, rufen Sie die Funktion als writeNums(1, <n>);

1

Ihr Programm erzeugt die folgende Ausgabe:

5 
4 
3 
2 
1, 2, 3, 4, 5 

Warum macht es das?

5 
4 
3 
2 
1 

Kommt aus der System.out.println(n); Linie. Sie rufen writeNums(5), die dann ruft writeNums(4), die writeNums(3) usw. ruft an. Jeder Anruf druckt n in einer neuen Zeile, bevor ein weiterer rekursiver Aufruf.

Dieser Teil: , 2, 3, 4, 5 wird durch die Zeile System.out.print(", " + n); gedruckt, nachdem der rekursive Aufruf abgeschlossen ist. So wird writeNums(2) drucken , 2 nach dem Aufruf von writeNums(1) zurückkehrt, wird writeNums(3) drucken , 3 nach dem Aufruf von writeNums(2) kehrt usw.

Wenn Sie das Programm wollen 1, 2, 3, 4, 5 drucken nur die System.out.println(n); Linie entfernen.

0

Die Zahlen werden rückwärts ausgedruckt, weil Sie die gleiche Methode vor dem Ausdruck der Zahl aufrufen, und sie wird sich selbst ausführen bis "if (n == 0)" erfüllt ist und in diesem Fall wird sie sich selbst beenden und kann weiterhin nächste Zeile ausführen "System.out.print (", "+ n)". Also, so druckt alle Sequenz.

public static void writeNums(int n) { 
     if (n == 0){ 
            throw new IllegalArgumentException(); 
        }     
    else if (n == 1) { 
            System.out.print(n); 
        } else { 
            writeNums(n-1); 
            System.out.print(", " + n); 
        } 
    }