2010-12-22 15 views
33

C'è qualche controllo su quanto puoi chiamare Ricorsivamente qualcosa?Profondità di ricorsione in C# - Quanto in profondità puoi andare

Da un programma di test di base ho una profondità di ricorsione di poco più di 18k

che dipende dalla stacksize ....

c'è un modo per impostare un pezzo di memoria (forse un filo) con una pila enorme per aumentare la profondità di ricorsione?

+0

possibile duplicato di [Come si modifica la dimensione predefinita dello stack per executable.net gestito] (http://stackoverflow.com/questions/1042345/how-do-you-change-default-stack-size-for-managed -executable-net) –

+1

Infinitamente profondo. O almeno nelle lingue che supportano le chiamate di coda. – Juliet

+6

3 livelli profondi ...

risposta

40

Ho aumentato le dimensioni dello stack durante il riconoscimento di alcuni documenti. Era davvero necessario.

in modo da poter aumentare le dimensioni dello stack per filo utilizzando il codice seguente:

var stackSize = 10000000; 
Thread thread = new Thread(new ThreadStart(BigRecursion), stackSize); 

Discussione (ThreadStart, Int32) - Inizializza una nuova istanza della classe Thread, specificando la dimensione massima dello stack per il filo.

Source

Spero che questo quello che vi serve.

+9

Dubito davvero che questo sia ciò di cui tutti hanno bisogno. Semplicemente non dovresti creare un codice come questo, vorrei licenziare un programmatore che ha provato. Qualsiasi algoritmo ricorsivo può essere implementato senza ricorrere alla ricorsione e talvolta può essere implementato in modi che riducono l'ordine del problema di una certa entità. Questo è come un meccanico di auto che usa una mazza per riparare un motore. – Mick

+0

@Mick, e se il codice che utilizza la ricorsione è fuori dal tuo controllo? Ad esempio, potresti utilizzare una libreria di terze parti che utilizza la ricorsione. – Sam

+8

Troverò la quarta parte;) – Mick

5

La dimensione dello stack predefinita è memorizzata nell'intestazione PE.

Se si genera il thread manualmente, Thread ha un costruttore che prende le dimensioni dello stack come parametro.

Tuttavia, la dimensione dello stack .NET predefinito di 1 MB dovrebbe essere sufficiente per la maggior parte delle attività, quindi prima di cambiarlo è necessario rivedere almeno l'attività.

16

Penso che stai rischiando problemi qui. È difficile determinare esattamente la quantità di stack che verrà utilizzata da un algoritmo ricorsivo. E, se sei al punto in cui c'è qualche domanda su se ci sarà abbastanza, cercherò un altro approccio.

La maggior parte degli algoritmi ricorsivi potrebbe essere riscritta per non essere ricorsiva. È quindi possibile allocare tutta la memoria di cui si ha bisogno e persino recuperare con garbo se non è sufficiente.

+16

+1 Ogni algoritmo ricorsivo può essere scritto come non ricorsivo con un ciclo e una struttura di dati dello stack. –

+6

@Byron: Grazie per avermi fatto ricordare la mia classe di strutture dati al college. Prof: "Scrivi questo programma tree-traversal in un formato non ricorsivo." Io: "Perché ci odi?" :) –

+4

La mia domanda era come farlo, ero più curioso di voler farlo davvero. Sebbene questo sia un buon consiglio, non risponde alla domanda come posta. –

2

Anche se si riesce a ottenere profondità di ricorsione maggiori, semplicemente per motivi di prestazioni, implementerei questo algoritmo senza ricorsione. Le chiamate ai metodi sono molto più costose delle iterazioni all'interno di un ciclo while. Vi sconsiglio vivamente di implementare tutto ciò che richiede il giochino con la dimensione dello stack predefinita.

Occasionalmente uso la ricorsione ma solo quando la profondità della chiamata è definita e bassa (come in meno di 100). Quando si creano software commerciali, l'utilizzo di algoritmi ricorsivi che hanno un numero indefinito di iterazioni è completamente poco professionale e probabilmente ti darà clienti molto arrabbiati.

Problemi correlati