Pile d'appels
Pour illustrer les exemples de cette partie, nous allons utiliser la fonction rectangle() définie comme suit :
from turtle import *
def rectangle(n):
"""
n - int, entier strictement positif
"""
color('white', 'blue')
begin_fill()
for _ in range(2):
forward(10)
left(90)
forward(n)
left(90)
end_fill()
forward(10)
if __name__ == "__main__":
TurtleScreen._RUNNING = True
hideturtle()
speed(0)
rectangle(50)
exitonclick()
Ordre des appels récursifs
Dans une fonction récursive, l'ordre d'exécution des instructions dépend des appels récursifs à la fonction. En d'autres termes, certaines instructions peuvent être exécutées immédiatement tandis que d'autres sont mises en attente dans une pile d'appels.
Exemple 1
On considère la fonction récursive suivante :
def fct1(n):
"""
n - int
"""
if n > 10:
rectangle(n)
fct1(n-10)
On effectue l'appel fct1(50). Quelle est la pile d'appel, et le tracé obtenu ?
Exemple 2
On échange les instructions de deux lignes pour définir la fonction récursive suivante :
def fct2(n):
"""
n - int
"""
if n > 10:
fct2(n-10)
rectangle(n)
On effectue l'appel fct1(50). Quelle est la pile d'appel, et le tracé obtenu ?
Détails
Lorsqu'on exécute fct2(50) :
- On exécute
fct2(40)donc on met en attenterectangle(50); - On exécute
fct2(30)donc on met en attenterectangle(40)en priorité devantrectangle(50)carfct2(40)doit être exécuté avantrectangle(50); - On exécute
fct2(20)donc on met en attenterectangle(30)en priorité devantrectangle(40)en priorité devantrectangle(50); - On exécute
fct2(10)donc on met en attenterectangle(20)en priorité devantrectangle(30)en priorité devantrectangle(40)en priorité devantrectangle(50); 10n'est pas strictement supérieur à10, les appels se terminent.- On dépile par ordre de priorité en traçant dans l'ordre
rectangle(20),rectangle(30),rectangle(40)puisrectangle(50)