web-dev-qa-db-fra.com

Profondeur de récursivité C # - À quelle profondeur pouvez-vous aller

Existe-t-il un contrôle sur la quantité d'appels récursifs que vous pouvez utiliser?

À partir d'un programme de test de base, j'obtiens une profondeur de récursivité d'un peu plus de 18k

qui dépend de la taille de la pile ....

existe-t-il un moyen de configurer un morceau de mémoire (peut-être un thread) avec une pile massive pour augmenter la profondeur de récursivité?

49
Keith Nicholas

J'ai augmenté la taille de la pile lors de la reconnaissance de certains documents. C'était vraiment nécessaire.

Vous pouvez donc augmenter la taille de la pile pour le thread en utilisant le code suivant:

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

Thread (ThreadStart, Int32) - Initialise une nouvelle instance de la classe Thread, spécifiant la taille de pile maximale pour le thread.

Source

J'espère que c'est ce dont vous avez besoin.

48
Andrew Orsich

Je pense que vous risquez des problèmes ici. Il est difficile de déterminer exactement la quantité de pile qu'un algorithme récursif utilisera. Et, si vous êtes au point où vous vous demandez s'il y en aura assez, je chercherais une autre approche.

La plupart des algorithmes récursifs pourraient être réécrits pour ne pas être récursifs. Vous pouvez ensuite allouer autant de mémoire que nécessaire et même récupérer gracieusement s'il n'y en a pas assez.

20
Jonathan Wood

La taille de pile par défaut est stockée dans l'en-tête PE.

Si vous générez le thread vous-même, Thread a un constructeur qui prend la taille de la pile comme paramètre.

Cependant, la taille de pile .NET par défaut de 1 Mo devrait être suffisante pour la plupart des tâches, donc avant de la modifier, vous devriez au moins revoir la tâche.

5
Brian Rasmussen

Même si vous parvenez à obtenir de plus grandes profondeurs de récursivité, simplement pour des raisons de performances, je mettrais en œuvre cet algorithme sans récursivité. Les appels de méthode sont beaucoup plus chers que les itérations dans une boucle while. Je déconseille fortement d'implémenter tout ce qui nécessite de jouer avec la taille de pile par défaut.

J'utilise parfois la récursivité mais uniquement lorsque la profondeur d'appel est définie et faible (comme dans moins de 100). Lors de la création de logiciels commerciaux, l'utilisation d'algorithmes récursifs qui ont un nombre indéfini d'itérations n'est absolument pas professionnelle et risque de vous donner des clients très en colère.

3
Mick