Livre_silo 30 août 2013 16:32 Page 137
¨
©
¨
©
¨
©
¨
©
C o p y r i g h t E y r o l l e s
137
5 – Fonctions
Cependant, rien n’exclut qu’il s’agisse d’une expression plus compliquée. La célèbre « fonction 91 » de McCarthy en est un exemple :
def f91(n):
if n <= 100:
return f91(f91(n + 11))
else:
return n - 10
Il existe même des fonctions récursives dont on ne sait pas démontrer la terminaison,
comme la célèbre suite de Syracuse :
def syracuse(n):
if n == 1:
return 1
elif n % 2 == 0:
return syracuse(n // 2)
else:
return syracuse(3 * n + 1)
Exercice 5.13 Démontrer la terminaison de la fonction f91.
SAVOIR-FAIRE Déboguer une fonction récursive
Lorsqu’ on débogue une fonction récursive, il faut évidemment entrer dans les appels
récursifs pour comprendre ce qui se passe : on est naturellement conduit à effectuer
Pas vers l’intérieur.
Cependant, comme expliqué dans ce chapitre, à chaque appel récursif, il est créé
un nouvel ensemble de variables locales à la fonction. L’explorateur de variables ne
montre que les variables en cours d’utilisation, autrement dit celles qui sont propres
à l’appel dans lequel on se situe.
Il y a cependant une possibilité pour visualiser la suite d’appels récursifs déjà effectués.
En tapant w (pour where) dans l’interpréteur, on voit apparaître la liste des appels de
fonctions en cours, le plus récent étant situé tout en bas. Ensuite, il est possible de se
déplacer dans cette liste avec les commandes u (pour up) et d (pour down). L’explorateur
de variables montre alors les contenus des variables correspondant à ces différents
appels.
Spyder ne propose pour l’instant pas d’interface graphique pour effectuer ces manipulations.
Précédent

- 150/402

Suivant