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?
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:
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
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é.
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.
Tout algorithme implémenté à l'aide de la récursion peut également être implémenté à l'aide d'une itération.
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.
Commencer:
Avantages:
Les inconvénients:
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.
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é.
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.
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é.
Nous devrions utiliser la récursivité dans les scénarios suivants:
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é.