la récursivité rapport à l'itération
Est-il correct de dire que partout recursion
est utilisé pour la boucle pourrait être utilisé? Et si la récursivité est généralement plus lent, ce qui est la raison technique pour toujours à l'aide de plus de pour tour de boucle?
Et si il est toujours possible de convertir une récursion dans une boucle for est là une règle de pouce moyen de le faire?
recursion
vsiteration
?iteration = for loop
Je pense.- Tom Moertel blog a quatre excellents posts sur la conversion de récursive code itératif code: blog.moertel.com/tags/recursion.html
Vous devez vous connecter pour publier un commentaire.
La récursivité est généralement beaucoup plus lent parce que tous les appels de fonction doivent être stockés dans une pile à permettre le retour à la fonction appelante. Dans de nombreux cas, la mémoire doit être allouée et copié à mettre en œuvre isolation du périmètre.
Quelques optimisations, comme la queue d'appel d'optimisation, faire des récurrences plus rapide, mais ce n'est pas toujours possible, et ne sont pas mis en œuvre dans toutes les langues.
Les principales raisons d'utiliser la récursivité sont
Bien sûr, chaque récursion peut être modélisé comme une sorte de boucle : c'est que le CPU en fin de compte ne. Et la récursivité lui-même, plus directement, les moyens de mettre les appels de fonction et les étendues dans une pile. Mais les changements d'algorithme récursif d'une boucle on pourrait avoir besoin de beaucoup de travail et de rendre votre code moins maintenable : comme pour chaque optimisation, il ne devrait être envisagée que lorsque certains profils ou des éléments de preuve ont montré qu'il est nécessaire.
f(n)
qui renvoie le n-ième nombre de Fibonacci.Oui, parce que la récursivité dans la plupart des Processeurs est modélisé avec des boucles et une pile de structure de données.
Il n'est pas "généralement plus lent": c'est la récursivité qui est appliquée correctement c'est plus lent. En plus de cela, les compilateurs modernes sont bons à la conversion de certaines récurrences à boucles sans même demander.
Écriture itérative des programmes pour les algorithmes mieux compris lorsqu'il est expliqué de manière itérative; écriture récursive des programmes pour les algorithmes mieux expliqué de manière récursive.
Par exemple, la recherche des arbres binaires, l'exécution de quicksort, et l'analyse des expressions dans de nombreux langages de programmation est souvent expliqué de manière récursive. Ces sont les mieux codé de manière récursive ainsi. D'autre part, le calcul de factorielles et le calcul des nombres de Fibonacci sont beaucoup plus facile à expliquer en termes d'itérations. En utilisant la récursivité pour eux, c'est comme écraser des mouches avec un marteau de forgeron: il n'est pas une bonne idée, même lorsque le marteau fait un très bon travail+.
+ j'ai emprunté la masse analogie de Dijkstra est "la Discipline de la Programmation".
Question :
Réponse :
Parce que, dans certains algorithmes sont difficiles à résoudre de manière itérative. Essayez de résoudre la profondeur de recherche est à la fois de manière récursive et itérative. Vous obtiendrez l'idée qu'il est clair difficiles à résoudre DFS avec itération.
Une autre bonne chose à essayer : Essayer d'écrire de Fusion de tri de manière itérative. Il vous faudra très peu de temps.
Question :
Réponse :
Oui. Cette fil a une très bonne réponse à cette question.
Question :
Réponse :
Confiance en moi. Essayez d'écrire votre propre version de résoudre en profondeur d'abord de recherche de manière itérative. Vous remarquerez que certains problèmes sont plus faciles à résoudre de manière récursive.
Conseil : la Récursivité est bon quand vous êtes à la résolution d'un problème qui peut être résolu par diviser pour régner technique.
En plus d'être plus lente, la récursivité peuvent également entraîner des erreurs de dépassement de pile en fonction de la profondeur de passe.
D'écrire une méthode équivalente à l'aide de l'itération, nous devons explicitement l'utilisation d'une pile. Le fait que l'itératif version nécessite une pile pour sa solution indique que le problème est assez difficile qu'il puisse bénéficier de la récursivité. En règle générale, la récursivité est le plus approprié pour des problèmes qui ne peuvent être résolus par un montant fixe de la mémoire et, par conséquent, nécessitent une pile lorsque résolu de manière itérative.
Cela dit, la récursivité et itération peut montrer le même résultat, tandis qu'ils suivent de modèle différent.Pour décider de la méthode qui fonctionne le mieux est au cas par cas et de bonnes pratiques est à choisir en fonction sur le même schéma que le problème de la façon suivante.
Par exemple, pour trouver le n-ième nombre triangulaire de
Triangulaire de la séquence: 1 3 6 10 15 ...
Un programme qui utilise un algorithme itératif pour trouver le n-ième nombre triangulaire:
À l'aide d'un algorithme itératif:
À l'aide d'un algorithme récursif:
La plupart des réponses semblent supposer que
iterative
=for loop
. Si votre boucle for sans restriction (la C, vous pouvez faire ce que vous voulez avec votre compteur de boucle), puis c'est correct. Si c'est un réelfor
boucle (disons comme en Python ou la plupart des langages fonctionnels où vous ne pouvez pas modifier manuellement le compteur de boucle), puis il est pas correcte.Tous (calculable) les fonctions peuvent être mises en œuvre de manière récursive et à l'aide de
while
boucles (ou conditionnelle sauts, qui sont au fond la même chose). Si vous vraiment vous limiter àfor loops
, vous obtenez seulement un sous-ensemble de ces fonctions (la primitive récursive, si vos opérations élémentaires sont raisonnables). Certes, c'est un assez grand sous-ensemble qui contient tous les unique de la fonction vous êtes susceptible d'rencontrons dans la pratique.Ce qui est beaucoup plus important, c'est que beaucoup de fonctions sont très faciles à mettre en œuvre de manière récursive et terriblement difficile à mettre en œuvre de manière itérative (manuellement la gestion de votre pile d'appel ne compte pas).
Je crois me souvenir de mon professeur d'informatique-dire à l'époque que tous les problèmes qui ont récursive des solutions ont également itératif des solutions. Il dit que une solution récursive est généralement plus lent, mais ils sont fréquemment utilisés quand ils sont plus faciles à comprendre et que le code itératif solutions.
Toutefois, dans les cas les plus avancés, récursive des solutions, je ne crois pas qu'il sera toujours en mesure de les mettre en œuvre à l'aide d'un simple
for
boucle.Oui, comme dit par Thanakron Tandavas,
Par exemple: les Tours de Hanoi
qu'ils sont empilés sur 3 pôles ...Mais
Beaucoup de bonnes raisons ont été données et je voudrais partager un point de plus. Certains des problèmes sont magnifiquement résolu par récurrence plutôt ne peut être résolu que par la récursivité. Un échantillon de exemple serait:
Imprimer toutes les valeurs d'un tableau, mais les éléments d'un tableau peut être des tableaux ainsi. Il pourrait y avoir des tableaux imbriqués, mais nous ne sommes pas sûr de la profondeur de tableaux imbriqués.
Une belle solution serait celui-ci:
De sortie:
Maintenant ce type de problème ne peut être résolu par
iterative approach
puisque la nature des problèmes exige solution dynamique.Can you always turn a recursive function into an iterative one? Yes, absolutely, and the Church-Turing thesis proves it if memory serves. In lay terms, it states that what is computable by recursive functions is computable by an iterative model (such as the Turing machine) and vice versa. The thesis does not tell you precisely how to do the conversion, but it does say that it's definitely possible.
la récursivité + mémorisation pourrait conduire à une solution plus efficace de les comparer avec une pure approche itérative, par exemple, vérifiez ceci:
http://jsperf.com/fibonacci-memoized-vs-iterative-for-large-n
Réponse courte: le compromis est la récursivité est plus rapide et pour les boucles de prendre moins de mémoire, dans presque tous les cas. Cependant, il existe généralement des moyens de changer la boucle for ou la récursivité pour le faire fonctionner plus rapidement