Livre_silo 30 août 2013 16:32 Page 131
¨
©
¨
©
¨
©
¨
©
C o p y r i g h t E y r o l l e s
131
5 – Fonctions
Il affiche 1.7321428571428572 à l’écran. Pour comprendre comment ce résultat est calculé, on
va suivre pas à pas l’exécution de cet appel de fonction.
Juste après l’appel u(2), la fonction u compare la valeur de son argument formel n (qui vaut
ici 2) avec 0 et exécute la branche else de l’instruction conditionnelle. Avant d’exécuter
l’instruction x = u(n-1), l’état de la mémoire est donc le suivant :
u(2)
. .
2 .
n
. .
? .
x
La variable locale x n’a toujours pas reçu de valeur. L’exécution se poursuit par l’appel u(2-1).
Toute la subtilité des fonctions récursives se dévoile dans ce deuxième appel. Que ce soit les
paramètres formels ou les variables locales, toutes les variables dont la portée est limitée à
une fonction s’ajoutent à l’état mémoire du programme lorsque celle-ci est appelée. Ainsi,
l’état mémoire après ce deuxième appel est constitué de deux variables n et de deux variables
locales x : celles allouées par l’appel u(2) et celles allouées pour u(1). Ces variables n’ont de
commun que le nom qu’on leur a donné, car elles représentent bien des cases mémoire
distinctes.
u(1)
. .
1 .
n
. .
? .
x
u(2)
. .
2 .
n
. .
? .
x
Tout comme pour l’appel précédent, la nouvelle variable locale x ne contient toujours pas de
valeur avant d’exécuter x = u(1-1). Ce dernier appel à la fonction u aboutit à l’état mémoire
suivant :
u(0)
. .
0 .
n
u(1)
. .
1 .
n
. .
? .
x
u(2)
. .
2 .
n
. .
? .
x
¨
©
¨
©
¨
©
¨
©
C o p y r i g h t E y r o l l e s
131
5 – Fonctions
Il affiche 1.7321428571428572 à l’écran. Pour comprendre comment ce résultat est calculé, on
va suivre pas à pas l’exécution de cet appel de fonction.
Juste après l’appel u(2), la fonction u compare la valeur de son argument formel n (qui vaut
ici 2) avec 0 et exécute la branche else de l’instruction conditionnelle. Avant d’exécuter
l’instruction x = u(n-1), l’état de la mémoire est donc le suivant :
u(2)
. .
2 .
n
. .
? .
x
La variable locale x n’a toujours pas reçu de valeur. L’exécution se poursuit par l’appel u(2-1).
Toute la subtilité des fonctions récursives se dévoile dans ce deuxième appel. Que ce soit les
paramètres formels ou les variables locales, toutes les variables dont la portée est limitée à
une fonction s’ajoutent à l’état mémoire du programme lorsque celle-ci est appelée. Ainsi,
l’état mémoire après ce deuxième appel est constitué de deux variables n et de deux variables
locales x : celles allouées par l’appel u(2) et celles allouées pour u(1). Ces variables n’ont de
commun que le nom qu’on leur a donné, car elles représentent bien des cases mémoire
distinctes.
u(1)
. .
1 .
n
. .
? .
x
u(2)
. .
2 .
n
. .
? .
x
Tout comme pour l’appel précédent, la nouvelle variable locale x ne contient toujours pas de
valeur avant d’exécuter x = u(1-1). Ce dernier appel à la fonction u aboutit à l’état mémoire
suivant :
u(0)
. .
0 .
n
u(1)
. .
1 .
n
. .
? .
x
u(2)
. .
2 .
n
. .
? .
x
