Question

Je suis en train d'écrire une fonction récursive qui a besoin de stocker et de modifier un objet (disons un ensemble) comme récursif. Dois-je utiliser un nom global dans la fonction? Une autre option consiste à modifier ou hériter de la classe du paramètre de la fonction afin qu'il puisse garder cet objet persistant, mais je ne trouve pas élégant. Je pourrais aussi utiliser une pile si je renoncerait à la récursion tout à fait ...

Y at-il un moyen pythonique de le faire? un générateur pourrait faire l'affaire?

Était-ce utile?

La solution

Il suffit de passer à travers votre objet persistant par la méthode récursive.

def recursivemethod(obj_to_act_on, persistent_obj=None):

    if persistent_obj == None:
        persistent_obj = set()

    # Act on your object

    return recursivemethod(newobj, persistent_obj)

Autres conseils

Faire passer l'ensemble dans la méthode récursive comme argument, puis modifier là avant de passer à l'étape suivante. Les objets complexes sont passés par référence.

Les objets sont passés par référence. Si vous ne modifier un objet, vous pouvez le faire à partir d'une fonction récursive et le changement sera globalement visible.

Si vous devez attribuer une variable dans une fonction récursive et le voir après le retour de la fonction, alors vous ne pouvez pas simplement attribuer une variable locale avec =. Ce que vous pouvez faire est de mettre à jour un champ d'un autre objet.

class Accumulator: pass

def foo():
    # Create accumulator
    acc = Accumulator()
    acc.value = 0

    # Define and call a recursive function that modifies accumulator
    def bar(n):
        if (n > 0): bar(n-1)
        acc.value = acc.value + 1
    bar(5)

    # Get accumulator
    return acc.value

Si c'est un conteneur (pas un type de données immuable), vous pouvez passer par l'objet:

import random

def foo(bar=None, i=10):
    if bar is None:
        bar = set()
    if i == 0:
        return bar
    bar |= set(random.randint(1, 1000) for i in xrange(10))
    return foo(bar, i - 1)

random_numbers_set = foo()

(Ne me demandez pas ce que ça voulait dire faire ... Je ne faisais que taper des choses au hasard: P)

Si l'objet que vous passez est mutable puis passe à en récurrences plus profondes on le verra dans récurrences plus tôt.

  1. Utilisez une variable globale à la fonction.

  2. Passe l'objet autour d'accumulateur:

    def recurse(foo, acc=None):
        acc = {}
        recurse(acc)
    
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top