web-dev-qa-db-fra.com

Comment puis-je créer une fonction récursive en python?

Comment puis-je créer une fonction récursive en python?

41
sddaf ads

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:

  • La condition de résiliation: n == 0
  • L'étape de réduction où la fonction s'appelle à chaque fois avec un nombre plus petit: factorial(n - 1)
81
Greg Hewgill

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

11

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.

5
MiniQuark

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)
3
Evan Fosmark