Comment puis-je créer une fonction récursive en python?
Je me demande si vous vouliez dire "récursif". Voici un exemple simple d'une fonction récursive pour calculer la fonction factorielle :
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
Les deux éléments clés d'un algorithme récursif sont:
n == 0
factorial(n - 1)
La récursivité en Python fonctionne exactement comme la récursivité dans un autre langage, avec la construction récursive définie en termes de lui-même:
Par exemple, une classe récursive pourrait être un arbre binaire (ou n'importe quel arbre):
class tree():
def __init__(self):
'''Initialise the tree'''
self.Data = None
self.Count = 0
self.LeftSubtree = None
self.RightSubtree = None
def Insert(self, data):
'''Add an item of data to the tree'''
if self.Data == None:
self.Data = data
self.Count += 1
Elif data < self.Data:
if self.LeftSubtree == None:
# tree is a recurive class definition
self.LeftSubtree = tree()
# Insert is a recursive function
self.LeftSubtree.Insert(data)
Elif data == self.Data:
self.Count += 1
Elif data > self.Data:
if self.RightSubtree == None:
self.RightSubtree = tree()
self.RightSubtree.Insert(data)
if __== '__main__':
T = tree()
# The root node
T.Insert('b')
# Will be put into the left subtree
T.Insert('a')
# Will be put into the right subtree
T.Insert('c')
Comme déjà mentionné, une structure récursive doit avoir une condition de terminaison. Dans cette classe, ce n'est pas si évident car il ne se reproduit que si de nouveaux éléments sont ajoutés, et ne le fait qu'une seule fois supplémentaire.
A noter également, python par défaut a une limite à la profondeur de récursivité disponible, pour éviter d'absorber toute la mémoire de l'ordinateur. Sur mon ordinateur, c'est 1000. Je ne sais pas si cela change selon le matériel, etc. Pour voir le vôtre:
import sys
sys.getrecursionlimit()
et pour le régler:
import sys #(if you haven't already)
sys.setrecursionlimit()
edit: Je ne peux pas garantir que mon arbre binaire est le design le plus efficace de tous les temps. Si quelqu'un peut l'améliorer, je serais heureux d'entendre comment
Disons que vous voulez construire: u (n + 1) = f (u (n)) avec u (0) = u0
Une solution consiste à définir une fonction récursive simple:
u0 = ...
def f(x):
...
def u(n):
if n==0: return u0
return f(u(n-1))
Malheureusement, si vous souhaitez calculer des valeurs élevées de u, vous rencontrerez une erreur de dépassement de pile.
Une autre solution est une simple boucle:
def u(n):
ux = u0
for i in xrange(n):
ux=f(ux)
return ux
Mais si vous voulez plusieurs valeurs de u pour différentes valeurs de n, ce n'est pas optimal. Vous pouvez mettre en cache toutes les valeurs d'un tableau, mais vous pouvez rencontrer une erreur de mémoire insuffisante. Vous voudrez peut-être utiliser des générateurs à la place:
def u(n):
ux = u0
for i in xrange(n):
ux=f(ux)
yield ux
for val in u(1000):
print val
Il existe de nombreuses autres options, mais je suppose que ce sont les principales.
Exemple de fonction récursive:
def recursive(string, num):
print "#%s - %s" % (string, num)
recursive(string, num+1)
Exécutez-le avec:
recursive("Hello world", 0)