Maison >développement back-end >Tutoriel Python >Python prend-il en charge l'optimisation des appels de queue, et pourquoi ou pourquoi pas ?

Python prend-il en charge l'optimisation des appels de queue, et pourquoi ou pourquoi pas ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-05 03:08:13337parcourir

Does Python Support Tail Call Optimization, and Why or Why Not?

Python optimise-t-il la récursion de queue ?

En Python, l'optimisation des appels de queue (TCO) n'est pas prise en charge au sens traditionnel. Cela signifie que les fonctions récursives qui conservent le même cadre de pile tout au long des appels seront toujours soumises à la limite de profondeur de récursion maximale, ce qui entraînera l'erreur « RuntimeError : profondeur de récursion maximale dépassée. »

Exemple : Somme triangulaire Récursion

Considérons la fonction récursive suivante pour calculer la triangulaire sum :

def trisum(n, csum):
    if n == 0:
        return csum
    else:
        return trisum(n - 1, csum + n)

Cette fonction échoue avec « RuntimeError » lorsqu'elle est appliquée à de grandes valeurs de n.

Pourquoi Python n'optimise-t-il pas le TCO ?

Selon Guido van Rossum, le créateur de Python, il préfère la possibilité d'avoir des traçages appropriés à l'optimisation du TCO. Les traçages fournissent des informations de débogage précieuses, qui seraient perdues si le TCO était implémenté.

Élimination manuelle du TCO

Pour éviter l'erreur de profondeur de récursion, vous pouvez éliminer manuellement la récursion en utilisant une boucle while et des calculs itératifs :

def trisum(n, csum):
    while True:
        if n == 0:
            return csum
        n, csum = n - 1, csum + n

Ce code transforme la fonction récursive en une fonction itérative un, en s'assurant qu'il s'exécute sans dépasser la limite de profondeur de récursion.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en 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