La fermeture Golang est une fonctionnalité de langage très puissante qui nous permet de définir une fonction à l'intérieur d'une fonction, et la fonction peut accéder aux variables dans la portée de la fonction externe. L'utilisation de fermetures peut grandement simplifier la logique du code, rendant le code plus facile à lire et à maintenir. Dans cet article, nous présenterons comment utiliser les fermetures Golang pour implémenter la récursivité.
1. Récursion
La récursion est un processus de la pile du système d'exploitation. Son idée principale est qu'une fonction peut s'appeler pendant l'exécution. Les fonctions récursives peuvent résoudre de nombreux problèmes complexes, tels que le calcul des nombres de Fibonacci, la traversée d'un arbre binaire, etc.
2. Implémentation récursive simple
Dans Golang, l'implémentation de la récursion doit prêter attention à deux problèmes :
Ce qui suit est une implémentation récursive simple du calcul de la factorielle de n :
func factorial(n int) int { if n == 1 { return 1 } return n * factorial(n-1) }
3. Récursion de fermeture
Dans la fermeture Golang, nous pouvons définir une fonction à l'intérieur de la fonction, et la fonction peut accéder aux variables de portée de la fonction externe dans . Par conséquent, nous pouvons implémenter la récursivité via des fermetures.
Prenons la séquence de Fibonacci comme exemple. Voici un programme simple implémenté en utilisant la récursion de fermeture :
func fibonacci() func() int { a, b := 0, 1 return func() int { a, b = b, a+b return a } } func main() { f := fibonacci() for i := 0; i < 10; i++ { fmt.Println(f()) } }
Ce programme affichera les dix premiers termes de la séquence de Fibonacci.
Explication du code :
Nous définissons d'abord une fonction fibonacci, qui renvoie une fonction. Cette fonction définit deux variables a et b en interne, qui sont utilisées pour représenter les deux premiers termes de la séquence de Fibonacci.
Ensuite, nous renvoyons une fonction. Cette fonction utilise des fermetures en interne pour implémenter la récursion. Chaque fois que la fonction est appelée, les valeurs de a et b sont mises à jour avec les valeurs b et a+b précédentes, et la valeur de a est renvoyée.
Enfin, nous appelons cette fonction dans la fonction principale et imprimons les valeurs des dix premiers nombres de Fibonacci.
4. Applications de la récursion de fermeture
En utilisant la récursion de fermeture, nous pouvons implémenter de nombreuses applications intéressantes, telles que les problèmes FizzBuzz, Towers of Hanoi, etc. Ce qui suit prend les tours de Hanoï comme exemple pour présenter comment utiliser la récursivité de fermeture.
Les Tours de Hanoï sont un problème mathématique très classique. Il s'agit d'un algorithme diviser pour régner implémenté par récursion. La description du problème est la suivante :
Il y a trois piliers, à savoir A, B et C. Il y a 64 disques de tailles différentes sur le pilier A. Les disques de tailles différentes sont placés sur le pilier A dans l'ordre du petit au grand .Maintenant, tous les disques doivent être déplacés vers le pilier C. Les règles suivantes doivent être respectées pendant le déplacement :
Ce qui suit est le code pour implémenter Towers of Hanoi en utilisant la récursivité de fermeture :
func Hanoi(n int) func(string, string, string) { if n == 1 { return func(a, _, c string) { fmt.Println("Move disk from", a, "to", c) } } h := Hanoi(n - 1) return func(a, b, c string) { h(a, c, b) fmt.Println("Move disk from", a, "to", c) Hanoi(n-1)(b, a, c) } } func main() { Hanoi(3)("A", "B", "C") }
Ce programme affichera les étapes spécifiques pour déplacer trois disques de A à C.
Explication du code :
Nous définissons d'abord une fonction Hanoi, qui renvoie une fonction. Si le paramètre transmis n est égal à 1, alors une fonction de fermeture est directement renvoyée, qui est chargée de déplacer le disque du pilier A au pilier C.
Si la valeur n entrante est supérieure à 1, appelez d'abord Hanoi(n-1) de manière récursive, puis affichez les étapes spécifiques pour déplacer le disque d'un pilier à un autre, et enfin appelez Hanoi(n-1) de manière récursive Déplacez le disque au pilier C.
Enfin, nous appelons cette fonction dans la fonction principale et imprimons les étapes de mouvement spécifiques.
5. Résumé
Dans cet article, nous avons présenté les concepts de base et l'utilisation des fermetures Golang, et démontré l'utilisation de la récursion de fermeture pour résoudre différents problèmes à travers des exemples. La récursivité de fermeture est une technique de programmation très intéressante et puissante, qui peut grandement simplifier la logique du code et améliorer la lisibilité et la maintenabilité du code. Bien entendu, la récursivité de fermeture doit également être utilisée avec prudence, sinon elle pourrait entraîner des problèmes inattendus.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!