TP no2.5 - Algorithmique et Python : Retour sur structures
itératives
Mathématiques supérieures le 8 Décembre 2016
Dans ce TP intermédiaire, nous allons réviser les structures itératives (les boucles) qui permettent,
en algorithmique, d’automatiser la répétition d’un nombre prédéni ou non d’instructions.
1. Rappels sur les structures itératives
On rappelle les deux façons de créer des structures itératives en Python :
La boucle for :
on utilise lorsque l’on connaît à l’avance le nombre d’itérations à eectuer dans notre boucle : on
dit que c’est une boucle énumérée ;
La syntaxe est la suivante :
1for ... in range(...):
2instruction1
3instruction2
4.
5.
6.
ou plus généralement, en remplaçant "enumerable" par un objet énumérable (une liste, une chaîne
de caractères,...)
1for ... in "enumerable":
2instruction1
3instruction2
4.
5.
6.
La boucle while : on utilise lorsque le nombre d’itérations dépend de la véracité d’une expression
booléenne : on dit que c’est une boucle conditionnelle.
Voici la syntaxe du bloc d’une boucle conditionnelle :
1while expression_booleene:
2instruction1
3instruction2
4.
5.
6.
La boucle continue de s’eectuer tant que l’expression booléenne est expression_booleene est
évaluée vraie True et s’arrête lorsque expression_booleene est évaluée fausse False.
1
Contrairement à la boucle for ; la boucle while ne s’arrête au bout d’un nombre prédéni au départ
de la boucle. Ainsi, si la véracité de expression_booleene ne change pas pendant l’exécution de la
boucle, celle-ci peut ne jamais s’arrêter !! On s’assurera donc TOUJOURS qu’au bout d’un nombre
ni d’itérations, expression_booleene soit évaluée à False et donc que la boucle while nisse par
s’arrêter. Un exemple typique d’expression booléenne associée à une boucle while est la suivante :
1i=0
2while i<=100:
3instruction1
4instruction2
5i=i+1
2. Exemples
Exemple.
Exemple. gBoucle forBoucle for
Voici un exemple d’utilisation de la boucle for : le calcul des éléments des termes d’une suite
récurrente. Soit (un)nNla suite dénie par la relation de récurrence
u0= 1
un= 3un+ 2
Voici une fonction Python qui permet de déterminer le terme d’indice nde la suite (un):
1def suite(n):
2u=1# on initialise u à u_0, ensuite u contiendra les termes successifs de
la suite après chaque itération.
3for iin range(1,n):
4u=3*u+2# on affecte à u la valeur 3u+2 avec u valant u_(i-1). La
nouvelle valeur de u est donc u_i !
5return u
Exercice 1.
Exercice 1.
Écrire une fonction qui prend pour argument un entier nqui renvoie qui renvoie la somme des
inverses des entiers de 1àn, i.e. n
k=1
1
k.
Exemple.
Exemple. gBoucle whileBoucle while
Voici un exemple d’utilisation de la boucle while : soit xR+. On veut déterminer le plus grand
nombre entier ntel que son carré n2est inférieur ou égal à x. Voici une fonction Python prenant
xen argument et qui renvoie donc le plus grand ntel que n2x:
2
1def carre_plus_petit(x):
2n=0
3while n**2<=x:#tant que n au carré est plus petit que x
4n=n+1#ou de manière équivalente n+=1
5#tant que n**2<=x est vrai, la boucle continue.
6return n-1#on renvoie la dernière valeur qui rendait la condition de la
boucle vraie
Exercice 2.
Exercice 2.
Écrire une fonction qui prenne en argument un nombre pet qui renvoie le premier indice de la
suite (un)dénie plus haut telle que unp.
3. Invariant de boucle
Dénition 1.
Dénition 1. gInvariant de boucleInvariant de boucle
Un invariant de boucle est une assertion telle que :
i) Initialisation Cette assertion est vraie avant la première itération de la boucle ;
ii) Conservation si cette assertion est vraie avant une itération de la boucle, elle le reste
avant l’itération suivante ;
Cet invariant de boucle va nous permettre à la fois d’écrire nos algorithmes et de prouver qu’il
fonctionne (la correction d’un algorithme, que l’on abordera plus tard).
a. Cas de la boucle for
Dans le cas d’une boucle for, l’invariant de boucle va nous servir à écrire notre algorithme. Voici
comment le déterminer sur un exemple. Reprenons notre fonction qui calcule le terme d’indice nde la
suite un:
1def suite(n):
2u=1
3for iin range(n):
4u=3*u+2
5return u
On cherche donc une assertion (une proposition) qui vérie les points i) et ii) de la dénition précé-
dente : la voici
À l’entrée du i-ème tour de boucle, la variable uprend la valeur ui
Une fois que l’on a donné cet invariant, on se rend compte que l’instruction u=3*u+2dans le bloc
du for est naturelle puisqu’elle doit satisfaire à l’invariant de boucle.
En eet, si à l’entrée de la boucle indexée par i,ucontient ui, alors on aura, après l’instruction u=3*u+2
dans le tour de boucle indexée par i
3
u=3*u+1= 3ui+ 1 = ui+1.
Ainsi, on aura bien, à l’entrée du i+ 1-ème tour de boucle, u=ui+1 !
b. Cas de la boucle while
Dans le cas de la boucle while, l’invariant de boucle ne va plus forcément nous servir à écrire l’algo-
rithme, mais il va nous permettre de prouver que la boucle se termine. Reprenons notre exemple :
1def carre_plus_petit(x):
2n=0
3while n**2<=x:
4n+=1
5return n-1
Ici, l’invariant de boucle est :
À l’entrée du k-ième tour de boucle, la variable ncontient k1.
On a n2= (k1)2
k→∞ +, donc il existe un kpositif tel que n2x: par suite, la boucle va s’arrêter
au bout d’un nombre ni d’itération !
c. Exercices
Exercice 3.
Exercice 3.
1. On veut écrire une fonction qui prend pour argument un nombre net qui renvoie n!. Écrire
cette fonction en respectant l’invariant de boucle suivant :
À l’entrée du k-ième tour de boucle, la variable pprend la valeur k!
2. On veut programmer une fonction d’argument un entier net un oat xqui renvoie la
somme des xipour i= 0, ..., n i.e. n
i=0 xi. Énoncer un invariant de boucle pour cette
fonction, puis écrire cette fonction.
3. Que fait la fonction mystere suivante ? Déterminer un invariant de boucle pour la fonction
suivante et prouver que la boucle va se terminer grâce à cet invariant :
1def mystere(a,b):
2q=0
3r=a
4while r>=b:
5q+=1
6r=r-b
7return [q,r]
4
1 / 4 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !