2015-07-29 1 views
0

Récemment, j'ai pris l'habitude d'écrire des fonctions récursives dans des fonctions wrapper en python. Par exemple, ma vieille habitude d'appeler des fonctions récursives à partir d'une enveloppe est la suivante:Ecriture d'une fonction récursive dans la fonction dans python: obsolète?

def sortedArrayToBST(nums): 
    return _toBST(nums) 

def _toBST(nums): 
    if len(nums) == 0: return None 
    mid = len(nums)/2 
    root = TreeNode(nums[mid]) 
    root.left = _toBST(nums[:mid])   
    root.right = _toBST(nums[mid+1:]) 
    return root 

D'autre part, ma nouvelle habitude est d'intégrer cette fonction récursive dans l'emballage:

def sortedArrayToBST(self, nums): 

    def toBST(nums_): 
     if len(nums_) == 0: return None 
     mid = len(nums_)/2 
     root = TreeNode(nums_[mid]) 
     root.left = toBST(nums_[:mid]) 
     root.right = toBST(nums_[mid+1:]) 
     return root 

    return toBST(nums) 

(La raison pour laquelle je le fais est parce que vous ne voulez probablement pas polluer l'espace de noms avec des fonctions auxiliaires. De plus, vous pourriez traiter la fonction d'assistance comme une fermeture, au cas où vous voudriez accéder à des variables de la fonction wrapper.

Mais ce style d'écriture de code est-il déprécié? Je ne trouve nulle part dans PEP 8 que les fonctions d'incorporation dans les fonctions sont déconseillées.

+0

Dans la version imbriquée, la fonction d'assistance sera redéfinie chaque fois que la fonction externe est appelée. – augurar

+0

@augurar: C'est vrai. Mais à moins que j'écrive une très grande fonction récursive, cela ne devrait pas poser de problème pour redéfinir la fonction imbriquée à chaque fois. – hlin117

Répondre

1

Je ne connais aucune restriction concernant les fonctions imbriquées dans Python. Je ne pense pas que le fait de mener le nom avec un trait de soulignement soit justifié. Parce qu'une définition de fonction imbriquée ne sera pas en conflit avec des noms en dehors de cette portée locale, utilisez simplement le nom le plus naturel (comme si vous lisiez la fonction à quelqu'un et expliquiez comment cela fonctionne). D'autre part, il est préférable d'éviter la récursivité en Python en raison de l'absence d'élimination de la récursivité de la queue. Je vous suggère de lire ceci: http://blog.moertel.com/posts/2013-05-11-recursive-to-iterative.html ... et de voir si vous pouvez transformer votre code en une implémentation itérative.

+0

Merci pour le lien, Jim. Tu as raison, la récursion en python est assez lente. La raison pour laquelle je pratiquais le code récursif est pour les questions d'entrevue (il est plus rapide d'écrire du code récursif que du code itératif). Lorsque j'écris du code source, j'évite la récursivité. – hlin117

+0

J'ai changé mon code pour me débarrasser des caractères de soulignement devant 'toBST'. Merci pour la suggestion. – hlin117