Verständnisproblem mit rek. Programmierung



  • Hallo Leute,

    ich habe hier nach einem vorgegebenen Algorithmus ein C Programm codiert welches an sich auch ganz gut funktioniert. Es handelt sich dabei um eine Variante zur Lösung des Turmes von Hanoi. Ich habe anbei mal den quelltext reingeschrieben und meine beiden Fragen als Kommentare dazugeschrieben.
    Ich wäre sehr dankbar wenn mir jemand helfen könnte, Suche habe ich schon versucht(auch google), jedoch vor allem auf die 2. Frage noch keine Antwort gefunden.
    Das Prinzip des Turmes ist mir klar, es hat sich nur irgendwo ein Denkfehler eingeschlichen.

    Vielen Dank vorab!

    #include<stdio.h>
    #include<conio.h>

    int turm (int,char,char,char);

    void main(void)
    {
    //clrscr();
    /Frage 1: Wieso funktioniert das Bildschirm löschen mit dieser
    Fkt. nicht?(natürlich dann auskommentiert)
    /
    int n;
    do{
    printf("Turmhoehe eingeben: ");
    scanf("%d",&n);
    turm(n,'Q','L','Z');
    }while(n>0);
    }

    int turm(int n,char q,char l,char z)
    {
    if (n>0)
    {
    turm(n-1,q,z,l);/Frage 2: Wenn sich hier der Turm wieder selbst
    aufruft, wie kommt das Programm dann jemals in die
    nachfolgenden Codezeilen? Das wäre ja dann wie
    eine Schleife, oder?
    /
    printf("Scheibe von %c nach %c\n",q,z);
    turm(n-1,l,q,z);
    }
    }



  • Die Funktion clrscr gibt es nur in den Borland-Bibliotheken. Das Löschen des Bildschirmes ist nach C Standard auch gar nicht berücksichtigt, denke ich. Von daher geht das nur plattformabhängig. Zum Beispiel mit system("cls"); oder FillConsoleOutputCharacter.

    Der rekursive Funktionsaufruf kehrt ja sofort wieder zurück, wenn n den Wert 0 erreicht hat. Und da immer ein kleineres n übergeben wird, werden die nachfolgenden Zeilen des Funktionsaufrufes eine Ebene höher abgearbeitet, bis man auf der höchsten Ebene beim Ende der Funktion angelangt ist und somit der gesamte rekursive Vorgang abgeschlossen wurde.



  • Nein, system("cls") nimmt man dafür nicht her! Das ist das schlechteste Beispiel!

    Bitte in die Konsolen-FAQ bzw. Linux-FAQ schaun für systemspezifische Funktionen.

    @Chris464
    Bitte die Code-Tags verwenden ([C/C++] gleich unter den Smilies ;)). So wird der Quellcode, den du postest, lesbarer :).



  • Herzlichen Dank für die Infos, mit dem komm ich schon mal weiter!

    🙂



  • AJ schrieb:

    Nein, system("cls") nimmt man dafür nicht her!

    Ja, stimmt schon. Hätte ich wohl nicht als Beispiel anbringen sollen, sodass man sich sowas gar nicht erst angewöhnt, auch wenn es die einfachste Lösung ist. Ich würde es sowieso nicht benutzen 😉



  • Es ist eben nicht die "einfachste" Lösung. Aber wir sind uns ja einig, dass man system() nicht für Systembefehle mißbrauchen soll ;).



  • Welche ist denn die "einfachste" Lösung?



  • masterofx32 schrieb:

    Welche ist denn die "einfachste" Lösung?

    Eine systemspezifische Funktion.


Anmelden zum Antworten