C/C++ rekursive Funktionen

Von: , Frage gestellt am Di, 29. Feb 2000

Hi,

wie bekomme ich in C/C++ eine Funktion so rekursiv geschrieben, dass die Rücksprungadresse nicht gespeichert wird und es so zu keinem Stack-overflow kommt?

Habe natürlich den Sprungaufruf an letzter Stelle in der Funktion zu stehn. Will aber nich...

CU Dennis

6 Antworten zu dieser Frage

  1. Antwort von nach einer Stunde hilfreich
    Verständnisproblem

    Wenn die Rücksprungadresse nicht gespeichert wird, was soll die Funktion dann nach dem Ende machen???

    Peter [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

    • Antwort von nach einer Stunde hilfreich
      Re: Verständnisproblem

      Sie soll, als Beispiel, in die Unendlichkeit zählen. Liess sich in älteren Programmiersprachen für Rechenoperationen nutzen. Hier ein Beispiel:

      #include <stdio.h>
      void zahl(int a);
      int main()
      {
      zahl(1);
      return 0;
      }
      void zahl(int a)
      {
      printf("%d\n",a);
      zahl/*e*/(++a);
      }

      Bricht jedesmal mit einer Speicherverlätzung bei 11800 ab, also Stack overflow.

      Benötige es für verkettete Listen, brauch Rücksprungadresse nicht, kann somit sehr lange Ketten verarbeiten.

      CU Dennis

      • Antwort von nach 3 Stunden hilfreich
        Re^2: Verständnisproblem

        Sie soll, als Beispiel, in die
        Unendlichkeit zählen. Liess sich in
        älteren Programmiersprachen für
        Rechenoperationen nutzen. Hier ein
        Beispiel:

        #include <stdio.h>
        void zahl(int a);
        int main()
        {
        zahl(1);
        return 0;
        }
        void zahl(int a)
        {
        printf("%d\n",a);
        zahl/*e*/(++a);
        }

        Bricht jedesmal mit einer
        Speicherverlätzung bei 11800 ab, also
        Stack overflow.
        Aber genau so ist doch ein rekursiver Aufruf definiert: ich rufe mich selber auf, und kehre (irgendwann) zur aufrufenden Funktion zurück.
        In Deinem Beispiel MUSS es diesen Fehler geben, denn Du hast die Abbruchbedingung nicht formuliert. Benötige es für verkettete Listen, brauch
        Rücksprungadresse nicht, kann somit sehr
        lange Ketten verarbeiten.
        Bei der verketteten Liste ist bei jedem Listenelement die Adresse des nächsten gespeichert (und bei doppelter Verkettung auch die des vorherigen). So kannst Du Dich anhand eines Zeigers auf ein beliebiges Element durch die Liste hangeln, ohne Rücksprungadresse für die Zwischenwerte zu haben. Das ist aber nicht rekursiv!

        Gruß
        J.

      • Antwort von nach 10 Stunden hilfreich
        Re^2: Verständnisproblem

        Du brauchst eine Abbruchbedingung, bastel dir doch irgendwas, z.b. dass die Zahl zur vorherigen in den ersten 10 Dezimalstellen gleichgeblieben ist oder so.
        Aber irgendeine Bedingung bitte, dich auch eintritt, bevor dein Speicher voll is

  2. Antwort von nach einem Tag hilfreich
    Re: C/C++ rekursive Funktionen

    Hi Dennis!

    In deinem Fall würde ich dir eine Endlosschleife empfehlen, in der du die Funktion aufrufst !

    Ciao
    Mario

  3. Antwort von nach 2 Tagen hilfreich
    Re: C/C++ rekursive Funktionen

    entweder so:


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

    int x;
    void zahl(int a);

    int main(void)
    {
    for(;;)
    {
    zahl(x);
    x++;
    if (kbhit()!=0)
    break;
    }
    return 0;
    }

    void zahl(int a)
    {
    if ((a%1000)==0)
    printf("%d\n",a);
    }

    oder so:


    /* tab=2 */

    #include <stdio.h>

    int zahl(int a);
    int main(void);

    int zahl(int a)
    {
    /*
    coreleft() ermittelt den freien Speicherplatz im Hauptspeicher
    farcoreleft() ermittelt den freien Speicherplatz auf dem "far Heap"
    tiny, small, und medium Modelle: unsigned int coreleft(void);
    compact, large, und huge Modelle: unsigned long coreleft(void);
    alle auáer tiny Modelle: unsigned long farcoreleft(void);
    */
    unsigned int x=farcoreleft();
    unsigned int y=coreleft();

    if ((x!=0)&&(y!=0)) //nur solang noch Speicher verfgbar ist
    {
    if ((a%1000)==0) //nur alle 1000 Treffer anzeigen lassen
    fprintf(stdout,"%d\n",a); // a ausgeben lassen
    zahl(++a); //rekursiver Aufruf
    }
    else
    fprintf(stdout,"%d\n",a); //Endwert zur Kontrolle ausgeben lassen
    return 0;
    }

    int main(void)
    {
    fprintf(stdout,"\n");
    zahl(1);
    return 0;
    }

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!