C/C++ rekursive Funktionen

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

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]

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

#include
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

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

#include
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.

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

Hi Dennis!

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

Ciao
Mario

entweder so:

#include
#include
#include

int x;
void zahl(int a);

int main(void)
{
for(;:wink:
{
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

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;
}