A la rentrée 2019 le
Plusieurs calculatrices graphiques intègrent déjà une implémentation
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 :- NumWorksavecMicroPython 1.9.4
- Casio Graph 90+EavecMicroPython 1.9.4
- HP Primeavec l'écriturePythondeXcas
- le module externe TI-PythonpourTI-83 Premium CEavecCircuitPython(dérivé de MicroPython)
- TI-NspireavecMicroPython 1.4.6
- Casio Graph 90+Eavec l'écriturePythonde l'applicationKhiCAS
- Casio Graph 35+E/75+EetGraph 35+USB/75/85/95avec l'applicationCasioPython(MicroPython 1.9.4)
Ces diverses implémentations ne sont toutefois pas équivalentes.
C'est notamment le cas pour les fonctions récursives
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
La fonction
La fonction
Pythonnettes
en récursivité à l'aide du script suivant :- Code: Select all
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.
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.NumWorks
quant à elle déclenche la même erreur à seulement 27
niveaux de profondeur.
web
de la calculatrice NumWorks
ce n'est particulièrement pas joyeux, avec une limite à seulement 10
niveaux de récursion.
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.
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.
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
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 :
L'appel
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 wrote:>>> 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: Select all
def sumr(n):
if n<=0:
return 0
else:
return n+sumr(n-1)
L'appel
maxr(sumr)
devrait alors nous renvoyer :TI-Python wrote:>>> from recur import *
>>> maxr(sumr)
max recursion depth exceeded
21
>>>

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.

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.
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"
.
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 CasioPythonsurCasio Graph 35+E/75+EetGraph 35+USB/75/95à processeurSH4avec5351
- application CasioPythonsurCasio Graph 35+USB/75/95à processeurSH3etGraph 85avec644
- avec 130
- HP Primeavec98(conversion automatique en itératif au-delà)
- application KhiCASsurCasio Graph 90+Eavec98
- Casio Graph 90+Eavec82
- NumWorksavec27
- module externe TI-PythonpourTI-83 Premium CEavec21
- NumWorkspour navigateur avec10