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)
- TI-Nspire avec MicroPython 1.4.6
- Casio Graph 90+E avec l'écriture Python de l'application KhiCAS
- Casio Graph 35+E/75+E et Graph 35+USB/75/85/95 avec l'application CasioPython (MicroPython 1.9.4)
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.
- 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.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.except
semble apparemment incomplète puisque la variable ex n'est pas affectée avec le message d'erreur.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
>>>
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.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.
- 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