Per un programma AI C# uso una chiamata ricorsiva per trovare la migliore mossa successiva (utilizzando una matrice 30x30 per memorizzare lo stato attuale della scheda). Per ogni mossa che faccio, voglio vedere quale delle possibili mosse che posso fare dal nuovo stato della tavola sarà la migliore ... e così via fino a quando non raggiungerò una posizione di "fine del gioco" (non sono possibili ulteriori mosse in quel stato) o un timer interrompe il processo e non vengono effettuate ulteriori chiamate ricorsive (e viene restituita la "migliore" posizione nota). Questo solo per spiegare perché devo ricorrere alla ricorsione (non è la ricorsione della coda) e non posso usare un singolo stato (globale) della scheda, ma devo cercare tutti gli stati della scheda possibili dallo stato corrente.C'è un modo per controllare le dimensioni dello stack disponibili prima della chiamata ricorsiva? (C#)
(a volte) Ottengo un System.StackOverflowException. C'è un modo per controllare lo spazio di stack disponibile prima della prossima chiamata ricorsiva? Quindi potrei semplicemente restituire lo stato corrente come "la migliore posizione trovata finora" e non effettuare la prossima chiamata ricorsiva. Cioè quando lo stack disponibile diventa troppo piccolo, dovrebbe anche essere considerato come un caso base.
L'altra opzione, naturalmente, potrebbe essere quella di mettere semplicemente ogni chiamata ricorsiva in un blocco try..catch e gestire System.StackOverflowException usandolo come caso base?
Ridisegnare il codice? Uno stackoverflow è un segno di un errore o di un codice errato (C#). È necessaria una quantità folle di chiamate ricorsive per attivare uno stackoverflow. Usa un linguaggio funzionale che supporti le code-call, come F #, se vuoi davvero farlo in questo modo. C# non è progettato per questo. – Dykam
"Se si chiama un metodo ricorsivo o si pianifica di utilizzare molto spazio di stack, è necessario utilizzare il metodo RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup." - http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.runtimehelpers.probeforsufficientstack.aspx – DavidO