1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Deutsch
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Rekursion

  • Routerkiller
  • 6. Dezember 2007 um 20:36
  • Unerledigt
  • Routerkiller
    2
    Routerkiller
    Mitglied
    Punkte
    15
    Beiträge
    2
    • 6. Dezember 2007 um 20:36
    • #1

    Servus,

    könnte mir jemand erklären was das folgende Programm bewerkstelligt und warum?

    also als ausgabe kommt "Hochzählen: 0,1,2,3,4,5,6,7,8,9,10" raus, das WARUM ist mir allerdings leider nicht klar... :frowning_face:


    public class UpDown
    {
    // Gibt der Reihe nach alle Zahlen von 0 bis zahl aus (aufsteigend).
    static void up(int zahl)
    {
    if (zahl > 0)
    {
    up(zahl-1);
    System.out.print(",");
    }
    System.out.print(zahl);
    }


    public static void main(String[] args)
    {

    final int zahl = 10;
    okay
    System.out.println("Hochzählen: ");
    up(zahl);

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 6. Dezember 2007 um 21:54
    • #2

    Bitte Code immer zwischen [ code ] und [/ code ] schreiben (ohne Leerzeichen), sonst ist er unlesbar, und keiner mag dir helfen. Also:

    Code
    static void up(int zahl) {
        if (zahl > 0) {
            up(zahl-1);
            System.out.print(",");
        }
        System.out.print(zahl);
    }

    Man kann sich einen Funktionsaufruf ganz ganz ganz ganz grob so denken (sprich: tu es nicht), daß man im Körper der aufgerufenen Funktion die Parameter (in diesem Fall die Variable Zahl) durch die Argumentausdrücke (in deinem Fall die Zahl 10) ersetzt. So viel Zeit haben wir jetzt nicht, aber mal sehen, was der Aufruf up(2) tut:

    Code
    static void up(2) {
        if (2 > 0) {
            up(2-1);
            System.out.print(",");
        }
        System.out.print(2);
    }

    2 ist größer als 0, es wird also der Körper des if-Statements ausgewertet, und 2-1 ist 1, also bleibt:

    Code
    static void up(2) {
        up(1);
        System.out.print(",");
        System.out.print(2);
    }

    Den Aufruf up(1) ersetzen:

    Code
    static void up(2) {
        if (1 > 0) {
            up(1-1);
            System.out.print(",");
        }
        System.out.print(1);
        System.out.print(",");
        System.out.print(2);
    }

    1 ist größer als 0 und 1-1 ist 0, also haben wir:

    Code
    static void up(2) {
        up(0);
        System.out.print(",");
        System.out.print(1);
        System.out.print(",");
        System.out.print(2);
    }

    Aufruf up(0) ersetzen:

    Code
    static void up(2) {
        if (0 > 0) {
            up(0-1);
            System.out.print(",");
        }
        System.out.print(0);
        System.out.print(",");
        System.out.print(1);
        System.out.print(",");
        System.out.print(2);
    }
    Alles anzeigen

    Die Bedingung 0 > 0 ist falsch, also fällt der Körper des if-Statements weg. Es bleibt:

    Code
    static void up(2) {
        System.out.print(0);
        System.out.print(",");
        System.out.print(1);
        System.out.print(",");
        System.out.print(2);
    }

    Daß das dann "0,1,2" ausgibt, ist hoffentlich klar :)

    Das ist wie gesagt nicht wirklich das, was der Computer zur Ausführungszeit macht, aber es beschreibt ungefähr die Bedeutung des Programms.

    *plantsch*

  • Routerkiller
    2
    Routerkiller
    Mitglied
    Punkte
    15
    Beiträge
    2
    • 6. Dezember 2007 um 22:42
    • #3

    alles klar, vielen vielen Dank!!!

  • dummdenker
    1
    dummdenker
    Mitglied
    Punkte
    5
    Beiträge
    1
    • 15. Dezember 2007 um 20:59
    • #4

    Es wird zunächst mal die Zahl in den Speicher geschrieben und sich gemerkt, wo weiter gemacht werden soll nach dem Aufruf von

    Code
    up( )

    ! So entseht im Speicher ein Stapel:
    Zahl = 10 und mache weiter nach up( )
    Zahl = 9 und mache weiter nach up( )
    Zahl = 8 und mache weiter nach up( )
    Zahl = 7 und mache weiter nach up( )
    Zahl = 6 und mache weiter nach up( )
    Zahl = 5 und mache weiter nach up( )
    Zahl = 4 und mache weiter nach up( )
    Zahl = 3 und mache weiter nach up( )
    Zahl = 2 und mache weiter nach up( )
    Zahl = 1 und mache weiter nach up( )
    Zahl = 0 und mache weiter nach up( )

    Wenn die Zahl 0 ist, wird die if-Anweisung übergangen und somit direkt zur print-Anweisung gesprungen.
    die 0 wird geprintet und es wird weiter gemacht nach

    Code
    up( )


    gleichzeitig wird die aktuell bearbeitete Zeile aus dem Speicher entfernt
    Zahl = 10 und mache weiter nach up( )
    Zahl = 9 und mache weiter nach up( )
    Zahl = 8 und mache weiter nach up( )
    Zahl = 7 und mache weiter nach up( )
    Zahl = 6 und mache weiter nach up( )
    Zahl = 5 und mache weiter nach up( )
    Zahl = 4 und mache weiter nach up( )
    Zahl = 3 und mache weiter nach up( )
    Zahl = 2 und mache weiter nach up( )
    Zahl = 1 und mache weiter nach up( )
    die 1 wird geprintet und es wird weiter gemacht nach

    Code
    up( )


    gleichzeitig wird die aktuell bearbeitete Zeile aus dem Speicher entfernt
    Zahl = 10 und mache weiter nach up( )
    Zahl = 9 und mache weiter nach up( )
    Zahl = 8 und mache weiter nach up( )
    Zahl = 7 und mache weiter nach up( )
    Zahl = 6 und mache weiter nach up( )
    Zahl = 5 und mache weiter nach up( )
    Zahl = 4 und mache weiter nach up( )
    Zahl = 3 und mache weiter nach up( )
    Zahl = 2 und mache weiter nach up( )
    und so weiter...

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung

  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  • Deutsch
  • English
Zitat speichern