Mastering Programmation Récursive

J'ai de la difficulté à penser ou de résoudre le problème dans les termes de la récursivité. J'ai vraiment apprécié le concept et je peux les comprendre comme la création de la base de cas, la sortie de cas & les appels récursifs etc. Je peux résoudre des problèmes simples comme l'écriture factorielle ou la sommation des nombres entiers dans un tableau. C'est là que ma pensée s'arrête. Je ne pouvais pas vraiment d'appliquer les concepts ou de trouver des solutions quand le problème se complique. Par exemple, la tour de Hanoi, même si je peux comprendre le problème et la solution, j'ai, sur mon propre ne peut pas une solution. Elle s'applique à d'autres algorithmes comme le tri rapide/binary tree traversal ainsi. Donc ma question est

  1. Quelle est la meilleure façon de le maîtriser?
  2. Quelqu'un peut-il suggérer une liste de problèmes ou de questions, que je peux utiliser comme un exercice pratique?
  3. La connaissance fonctionnelle de la langue m'aider à comprendre?

S'il vous plaît conseils.

  • La récursivité est difficile tout simplement parce que nous ne sommes pas appris à penser de manière récursive tôt dans notre vie. J'ai trouvé utile lors de l'attaque d'un appel récursif problème d'abord penser à un cas de base. Quand j'ai réussi à identifier un cas de base, en s'appuyant sur haut de il est plutôt facile. Qui fonctionne pour moi.
  • Ce que j'ai trouvé m'a aidé lors de l'apprentissage de la récursivité est cette pensée: "la Récursivité est la façon de banaliser, ce qui signifie qu'il est généralement sous la forme de votre solution = trivial étape + un peu plus facile solution" Par exemple, pour l'hanoi exemple, je l'ai résolu en utilisant le raisonnement: le problème est résolu par la prise de conscience qu'elle implique a) le déplacement de la grande pièce (seul) du point 1 au point 3 (trivial étape) b) le déplacement d'un n-1 tour du point 2 au point 3 (un peu plus facile la solution) est légèrement plus facile solution peut être trouvée en répétant les étapes a) et b), uniquement pour la cible 2, et ainsi de suite...
  • La récursivité est tout au sujet de l'abstraction. Vous essayez d'exprimer la solution d'un problème dans le même format que le problème d'origine, mais avec des paramètres différents. Par exemple, 10! = 1 * 10! = 10 * 9!, donc, à la fois le problème et sa solution sont de la forme a * b!. La plupart des gens trouvent des abstractions difficile. Mais en fait, il est tout au sujet d'essayer de la trouver des similitudes dans des situations différentes. Vous pouvez même pratique dans votre vie de tous les jours (essayez de voir les similitudes entre les deux concepts différents).
  • En effet, la récursivité (et les preuves par induction) est quelque chose qu'on ne peut généralement pas être compris instantanément, bien qu'il n'est généralement pas très complexe. Un bon moyen est en effet d'étudier les problèmes mentionnés dans les réponses ci-dessous et essayer de formuler des problèmes et des structures de manière récursive, même si elle semble totalement artificiel. Cependant, je voudrais ajouter l'algorithme minimax qui peuvent être utilisés pour jouer à plusieurs jeux de société. Il peut également être vu comme la navigation d'un arbre de recherche.
  • Exercices: énumérer toutes les permutations d'une chaîne de caractères 'abcdefgh'. Ou toutes les combinaisons de 5 lettres de cette série. Conseils: supposons que vous disposez d'une fonction qui énumère toutes les permutations de 'abcdefg'; supposons que vous disposez d'une fonction qui énumère toutes les combinaisons de 4 lettres de 'abcdefgh' ou supposons que vous disposez d'une fonction qui énumère toutes les combinaisons de 5 lettres entre 'abcdefg'.
  • Une grande réponse sur la récursivité, par l'utilisateur @Barney: stackoverflow.com/a/22242301/2736496. C'est à propos d'une question à propos de la résolution d'un 0/1 labyrinthe en 2D-tableau, mais c'est aussi sur la récursivité en général.

InformationsquelleAutor Hunter | 2014-03-28