web-dev-qa-db-fra.com

Quels sont les avantages et les inconvénients de la récursivité?

En ce qui concerne l'utilisation de la récursion sur des méthodes non récursives dans les algorithmes de tri ou, en l'occurrence, n'importe quel algorithme, quels sont ses avantages et ses inconvénients?

29
Jeeka

Pour la plupart, la récursivité est plus lente et prend plus de place dans la pile. Le principal avantage de la récursivité est que, pour des problèmes tels que la traversée des arbres, l'algorithme est un peu plus facile ou plus "élégant" . Découvrez certaines des comparaisons:

lien

28
cmaynard

Récursion signifie qu'une fonction appelle à plusieurs reprises

Il utilise la pile système pour accomplir sa tâche. Comme la pile utilise l'approche LIFO Et quand une fonction est appelée, le contrôle est déplacé vers où la fonction est définie, elle est stockée en mémoire avec une adresse, cette adresse est enregistrée

Deuxièmement, cela réduit la complexité temporelle d'un programme. 

Bien qu'un peu hors sujet, un peu lié. Doit lire. : Récursion vs Itération

13
sgokhales

Tous les algorithmes peuvent être définis de manière récursive. Cela rend beaucoup, beaucoup plus facile à visualiser et à prouver. 

Certains algorithmes (par exemple, la fonction Ackermann Function ) ne peuvent pas (facilement) être spécifiés de manière itérative. 

Une implémentation récursive utilisera plus de mémoire qu'une boucle si l'optimisation d'appel final ne peut pas être effectuée. Bien que l'itération utilise moins de mémoire qu'une fonction récursive qui ne peut pas être optimisée, son pouvoir d'expression est limité.

12
S.Lott

Personnellement, je préfère utiliser Itératif que la fonction récursive. Surtout si votre fonction a une logique complexe/lourde et que le nombre d'itérations est grand. Cela parce qu'avec chaque appel récursif, la pile d'appels augmente. Cela risquerait de planter la pile si vos opérations étaient trop volumineuses et ralentissaient également le processus.

4
PraveenGorthy

Tout algorithme implémenté à l'aide de la récursion peut également être implémenté à l'aide d'une itération.

Pourquoi pas utiliser la récursivité

  1. Il est généralement plus lent en raison des frais généraux liés à la maintenance de la pile.
  2. Il utilise généralement plus de mémoire pour la pile.

Pourquoi utiliser utiliser la récursivité

  1. La récursivité ajoute de la clarté et réduit (parfois) le temps nécessaire à l'écriture et au débogage du code (mais ne réduit pas nécessairement les besoins en espace ni la vitesse d'exécution).
  2. Réduit la complexité temporelle.
  3. Fonctionne mieux dans la résolution de problèmes basés sur des structures arborescentes.

Par exemple, le problème de la tour de Hanoï est plus facilement résolu en utilisant la récursivité plutôt que l'itération.

3
Baba Rocks

Commencer:

Avantages:

  • C'est le moyen unique d'implémenter un nombre variable de boucles imbriquées (et le seul moyen élégant d'implémenter un grand nombre constant de boucles imbriquées).

Les inconvénients:

  • Les méthodes récursives génèrent souvent une exception StackOverflowException lors du traitement de grands ensembles. Les boucles récursives n'ont pas ce problème cependant.
3
nbarraille

Expressivité

La plupart des problèmes sont naturellement exprimés par la récursivité telle que Fibonacci, le tri par fusion et le tri rapide. À cet égard, le code est écrit pour les humains, pas pour les machines. 

Immutabilité

Les solutions itératives reposent souvent sur diverses variables temporaires, ce qui rend le code difficile à lire. Cela peut être évité avec la récursivité.

Performance

La récursivité n'est pas conviviale. La pile peut déborder lorsque la récursivité n'est pas bien conçue ou que l'optimisation de l'empennage n'est pas prise en charge.

0
Hui Wang

Il peut arriver que vous deviez abandonner la récursivité dans un problème où la récursion semble être votre avantage. En effet, dans le cas de problèmes où votre récursivité devrait se produire des milliers de fois, cela entraînerait une erreur de débordement alors que votre code ne pas rester coincé dans une récursion infinie. La plupart des langages de programmation vous limitent à un nombre d'appels de pile. Par conséquent, si votre récursivité dépasse cette limite, vous pouvez envisager de ne pas utiliser de récursivité.

0
Ogbe

Nous devrions utiliser la récursivité dans les scénarios suivants:

  • lorsque nous ne connaissons pas le nombre fini d'itérations, par exemple, notre condition de sortie de fonction est basée sur la programmation dynamique (mémorisation)
  • lorsque nous devons effectuer des opérations dans l'ordre inverse des éléments. Ce qui signifie que nous voulons traiter le dernier élément en premier, puis n-1, n-2 et ainsi de suite jusqu'au premier élément

La récursivité enregistrera plusieurs traversées. Et cela sera utile si nous pouvons diviser l’allocation de pile de la manière suivante:

int N = 10;
int output = process(N) + process(N/2);
public void process(int n) {
    if (n==N/2 + 1 || n==1) {
       return 1;
    }

    return process(n-1) + process(n-2);
}

Dans ce cas, seules des demi-piles seront allouées à un moment donné.

0
thpratik