A la rentrée 2019 le
Python sera le seul langage de programmation préconisé pour l'enseignement de l'algorithmique au lycée en Seconde et Première.
Plusieurs calculatrices graphiques intègrent déjà une implémentation
Python officielle dans leur dernière mise à jour, plus ou moins complète, fidèle et réussie selon le cas :
- NumWorks avec MicroPython 1.9.4
- Casio Graph 90+E avec MicroPython 1.9.4
- HP Prime avec l'écriture Python de Xcas
- le module externe TI-Python pour TI-83 Premium CE avec CircuitPython (dérivé de MicroPython)
À côté de cela nous avons aussi plusieurs implémentations communautaires, qui à la différence ne fonctionneront pas en mode examen en 2020 :
Ces diverses implémentations ne sont toutefois pas équivalentes.
C'est notamment le cas pour les fonctions récursives (fonctions qui se rappellent dans leur propre code), où certaines "Pythonnettes" nous avaient paru assez mauvaises.
Aujourd'hui, creusons donc les possibilités de nos
Pythonnettes en récursivité à l'aide du script suivant :
- Code: Tout sélectionner
def prodr(n):
if n<=0:
return 1
else:
return n*prodr(n-1)
def maxr(fct):
n=0
try:
while True:
fct(n)
n=n+1
except Exception as ex:
print(ex)
return n
La fonction
prodr(n)
effectue ici récursivement le produits des facteurs 1 à
n, c'est la fonction factorielle.
La fonction
maxr(fct)
va appeler
fct(n)
avec des valeurs de
n croissantes jusqu'à déclenchement d'une erreur, et nous indiquer alors la description de l'erreur et la profondeur de récursion atteinte.
Sur
TI-Nspire l'appel
maxr(prodr)
atteint une profondeur de
130 avant de nous renvoyer l'erreur
"maximum recursion depth exceeded". La profondeur maximum spécifiée lors de la compilation de l'interpréteur
Python a donc ici été atteinte, impossible d'aller plus loin.
La calculatrice
NumWorks quant à elle déclenche la même erreur à seulement
27 niveaux de profondeur.
Mais sur la version
web de la calculatrice
NumWorks ce n'est particulièrement pas joyeux, avec une limite à seulement
10 niveaux de récursion.
Sur
Casio Graph 90+E, le script atteint une profondeur de
82 mais en renvoyant une erreur différente,
"pystack exhausted", et la limitation n'a donc pas la même raison technique.
Avec l'application
KhiCAS, la
Graph 90+E fait un peu mieux avec une profondeur de
98. Mais ici la gestion de l'instruction
except
semble apparemment incomplète puisque la variable
ex n'est pas affectée avec le message d'erreur.
La
HP Prime qui utilise elle aussi un portage de
GIAC, cœur du logiciel
Xcas, atteint également une profondeur de récursivité de
98. Nuance toutefois, ici elle continue au-delà mais nous avertissant avec le message
"Exécution en mode d'évaluation non récursive". Il semble donc que la calculatrice optimise le code en convertissant les appels récursifs en itératif au-delà de 98 niveaux de profondeur.
Si cela n'a pas été corrigé depuis octobre dernier, le module externe
TI-Python pour
TI-83 Premium CE que les types de base, soit les
flottants uniquement en simple précision, et également les entiers uniquement courts, soit jusqu’à
$mathjax$2^{30}-1=1073741823$mathjax$
. La fonction factorielle produisant rapidement de longs entiers, l'appel
maxr(prodr)
devrait nous renvoyer :
TI-Python a écrit:>>> from recur import *
>>> maxr(prodr)
small int overflow
13
>>>
Mais ici la limite n'a donc rien à voir avec le fonctionnement de la récursivité. Afin de mieux évaluée ce dernier, contentons-nous donc plutôt de la somme récursive des termes de 0 à n :
- Code: Tout sélectionner
def sumr(n):
if n<=0:
return 0
else:
return n+sumr(n-1)
L'appel
maxr(sumr)
devrait alors nous renvoyer :
TI-Python a écrit:>>> from recur import *
>>> maxr(sumr)
max recursion depth exceeded
21
>>>
L'application
CasioPython sur
Graph 35+E/75+E et anciens modèles
Graph 35+USB/75/95 à processeur
SH4 nous atteint des sommets avec l'appel
maxr(prodr)
, plus exactement
674 de profondeur ! L’ascension est ici avortée par l'erreur
"memory allocation failed, allocating 672 bytes".
Mais là encore, si c'est une limite de mémoire cela n'a rien à voir spécifiquement avec la récursivité. Passons donc à l'autre fonction qui mettra beaucoup plus de temps avant d'arriver sur des entiers longs, et consommera donc beaucoup moins de mémoire.
Extraordinaire, l'appel
maxr(sumr)
atteint maintenant une profondeur de
5351. Le message d'erreur
"maximum recursion depth exceeded" nous confirme bien cette fois-ci qu'il s'agit de la limite finale.
Toutefois, si l'on installe l'application
CasioPython sur les premières
Casio Graph 35+USB/75/95 à processeur
SH3 ainsi que sur les
Graph 85, les résultats sont différents.
maxr(prodr)
n'atteint que
213 de profondeur avec l'erreur
"memory allocation failed, allocating 170 bytes".
Et avec
maxr(sumr)
l'erreur
"maximum recursion depth exceeded" se déclenche à seulement
644 de profondeur.
L'explication de la différence en est simple. Depuis la
version 1.6,
CasioPython dispose d'un nouveau code d'allocation mémoire lui permettant d'exploiter
256Kio au lieu de
32Kio. Mais hélas, pour le moment ce code n'est activé que sur les machines à processeur
SH4, alors que les anciennes calculatrices à processeur
SH3 disposaient pourtant déjà de ces mêmes
256Kio.
Petit classement donc de nos
Pythonnettes basée sur la profondeur maximale de récursion :
- application CasioPython sur Casio Graph 35+E/75+E et Graph 35+USB/75/95 à processeur SH4 avec 5351
- application CasioPython sur Casio Graph 35+USB/75/95 à processeur SH3 et Graph 85 avec 644
- TI-Nspire avec 130
- HP Prime avec 98 (conversion automatique en itératif au-delà)
- application KhiCAS sur Casio Graph 90+E avec 98
- Casio Graph 90+E avec 82
- NumWorks avec 27
- module externe TI-Python pour TI-83 Premium CE avec 21
- NumWorks pour navigateur avec 10