Maison > Article > développement back-end > Récursion et générateur de fonctions Python
1. Qu'est-ce que la récursion
Si une fonction contient un appel à elle-même, la fonction est récursive. En tant qu'algorithme, la récursion est largement utilisée dans les langages de programmation. Elle convertit généralement un problème vaste et complexe en un problème plus petit similaire au problème initial à résoudre. La stratégie récursive peut être décrite avec seulement un petit nombre de programmes. nécessaires pour résoudre le problème, réduisent considérablement la quantité de code dans le programme. Par exemple, pour calculer le produit de nombres à 9 chiffres de 1 à 9, l'algorithme intuitif est 1*2*3*4*5*6*7*8*9. Si vous souhaitez calculer le produit de 1 à 10 000. , l'algorithme intuitif est difficile à mettre en œuvre et la récursivité peut être facilement mise en œuvre. Veuillez voir l'exemple :
def fact(n):#计算给定数字到一的乘积 if n<=1: return 1 else: return n * fact(n-1) print (fact(7))
Le résultat est : 5040
Utilisons un exemple pour voir le processus d'exécution récursif :
def calc(n): print(n) if n/2 > 1: res = calc(n/2) return n calc(8)
Le résultat est :
8 4.0 2.0
Regardez à nouveau cet exemple :
def calc(n): print(n) if n/2 > 1: res = calc(n/2) print('res:',res) print("N:",n) return n calc(8)
Le résultat est :
8 4.0 2.0 N: 2.0 res: 2.0 N: 4.0 res: 4.0 N: 8
2. Générateur
Le générateur est un générateur avec une fonction d'instruction de rendement. Une fonction ou un sous-programme ne renvoie qu'une seule fois, mais un générateur peut suspendre l'exécution et renvoyer un résultat intermédiaire, renvoyer une valeur à l'appelant et suspendre l'exécution. Lorsque la méthode next() du générateur est appelée, elle continuera exactement là où elle s'est arrêtée
Regardez l'exemple ci-dessous :
def func(): print('11111111') yield [1] print(2222222222) yield 2 print(3333333333) yield 3 ret=func() r1=ret.__next__() print(r1) r2=ret.__next__() print(r2) r3=ret.__next__() print(r3)
Le résultat est :
11111111 [1] 2222222222 2 3333333333 3
Puisque la boucle for de python a l'appel next() et le traitement de StopIteration, utilisez un A for boucle au lieu d'itérer manuellement à travers un générateur (ou un itérateur de cette chose) est toujours beaucoup plus propre et plus joli. Exemple :
def func(): print('11111111') yield [1] print(2222222222) yield 2 print(3333333333) yield 3 ret=func() for i in ret: print(i)
Le résultat est le même que précédemment.
Ces exemples simples devraient vous donner une petite idée du fonctionnement des générateurs. En plus de next() pour obtenir la prochaine valeur générée, les utilisateurs peuvent renvoyer des valeurs au générateur [send()], lancer des exceptions dans le générateur et demander au générateur de quitter [close()]
Vous trouverez ci-dessous un exemple simple qui démontre ces fonctionnalités.
def counter(start_at=0): count = start_at while True: val = (yield count) if val is not None: count = val else: count += 1
Le générateur est livré avec une valeur initiale qui compte de 1 pour chaque appel au générateur [next()]. Les utilisateurs ont la possibilité de réinitialiser cette valeur s'ils souhaitent réellement appeler send() avec la nouvelle valeur au lieu d'appeler next(). Ce générateur fonctionne indéfiniment, donc si vous souhaitez y mettre fin, appelez la méthode close(). Si nous exécutons ce code de manière interactive, nous obtiendrons le résultat suivant :
>>> count = counter(5) >>> count.next() 5 >>> count.next() 6 >>> count.send(9) 9 >>> count.next() 10 >>> count.close() >>> count.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
L'article ci-dessus porte sur une compréhension approfondie de la récursivité et des générateurs des fonctions Python. . Je vous ai donné tout le contenu, j'espère qu'il pourra vous donner une référence, et j'espère que vous soutiendrez le site PHP chinois.
Pour plus d'articles liés à la récursivité et aux générateurs des fonctions Python, veuillez faire attention au site Web PHP chinois !