Maison > développement back-end > Golang > le corps du texte

Comment la fermeture Golang implémente-t-elle la récursion

PHPz
Libérer: 2023-03-30 09:55:14
original
697 Les gens l'ont consulté

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 :

  1. Il doit y avoir une condition de terminaison, sinon des problèmes de boucle infinie se produiront.
  2. Chaque récursion doit transmettre des données à la récursion suivante.

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)
}
Copier après la connexion

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())
    }
}
Copier après la connexion

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 :

  1. Un seul disque peut être déplacé à la fois.
  2. Le gros disque ne peut pas être au-dessus du petit disque.

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")
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!