Maison  >  Article  >  développement back-end  >  Récursion et générateur de fonctions Python

Récursion et générateur de fonctions Python

高洛峰
高洛峰original
2017-03-03 15:08:491334parcourir

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(&#39;res:&#39;,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(&#39;11111111&#39;)
  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(&#39;11111111&#39;)
  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 !

Déclaration:
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