2013-04-20 19 views
5

Per conoscere il limite delle chiamate ricorsive in C++ ho provato questa funzione!Limitare le chiamate ricorsive in C++ (circa 5000)?

void recurse (int count) // Each call gets its own count 
{ 
printf("%d\n",count); 
    // It is not necessary to increment count since each function's 
    // variables are separate (so each count will be initialized one greater) 
    recurse (count + 1); 
} 

questo programma si ferma quando il conteggio è uguale 4716! quindi il limite è solo 4716 !! Sono un po 'confuso !! perché il programma interrompe l'elaborazione quando il conteggio è uguale a 4716 !! PS: eseguito in Visual Studio 2010. grazie

risposta

11

Il limite di chiamate ricorsive dipende dalla dimensione dello stack. Il linguaggio C++ non sta limitando questo (dalla memoria, c'è un limite inferiore di quante chiamate di funzione un compilatore conforme agli standard dovrà supportare, ed è un valore piuttosto piccolo).

E sì, la ricorrenza "infinitamente" si fermerà in un punto o nell'altro. Non sono completamente sicuro di cos'altro ti aspetti.

Vale la pena notare che la progettazione di software per eseguire una ricorsione "illimitata" (o una ricorsione che viene eseguita a centinaia o migliaia) è una pessima idea. Non esiste un modo (standard) per scoprire il limite dello stack e non è possibile eseguire il ripristino da un arresto di overflow dello stack.

Troverete anche che se aggiungete una matrice o un'altra struttura di dati [e la usate, in modo che non venga ottimizzata], il limite di ricorsione diminuisce, perché ogni stack-frame utilizza più spazio sul pila.

Modifica: in realtà mi aspetterei un limite superiore, ho il sospetto che si stia compilando il codice in modalità di debug. Se lo compili in modalità di rilascio, mi aspetto che tu ne ottenga altre migliaia, forse addirittura infinite, perché il compilatore converte la ricorsione della coda in un ciclo.

+0

La ricorsione illimitata è possibile su alcuni obiettivi. GCC supporta qualcosa chiamato "split stack", che consente agli stack di crescere, * in modo discontinuo, * per riempire la memoria disponibile. Vedi http://gcc.gnu.org/wiki/SplitStacks –

+0

So che c'era un limite ma mi chiedo quale sia questo limite! non mi aspettavo che lo stack esplodesse in meno di 5000 chiamate! Grazie per la spiegazione ! – satyres

+0

C'è ancora un limite, e c'è ancora (per quanto ho capito) nessun modo per rilevare l'esaurimento dello stack. Utilizzando uno stack software, c'è almeno un modo per rilevare quando lo stack si esaurisce ... –

1

Probabilmente hai finito lo spazio di stack.

Ogni volta che si chiama la funzione ricorsiva, è necessario inserire un indirizzo di ritorno nello stack in modo che sappia dove tornare dopo la chiamata della funzione.

Si arresta in modo anomalo a 4716 perché accade appena di esaurire lo spazio di stack dopo circa 4716 iterazioni.

+0

ma è troppo piccolo !! solo 5000 chiamate !! come sapere la dimensione massima della pila! – satyres

+0

Ho pensato che la dimensione dello stack fosse legata alla dimensione della memoria del computer! quindi devo cambiarlo in VS2010! – satyres

+1

La dimensione dello stack predefinita è normalmente impostata nel file eseguibile. Non so dove ti è venuta l'idea che sia legato alla quantità di memoria del computer. – tangrs

2

La dimensione dello stack dipende dal proprio ambiente.

In * NIX, ad esempio, è possibile modificare le dimensioni dello stack nell'ambiente, quindi eseguire il programma e il risultato sarà diverso.

In Windows, è possibile modificare in questo modo (source):

$ editbin /STACK:reserve[,commit] program.exe 
+0

grazie mille per questa informazione! – satyres

Problemi correlati