TP Programmation : algorithme de dichotomie : « impératif vs récursif » TS
On veut résoudre une équation du type f(x)=0 sur un intervalle I avec fune fonction continue, strictement mono-
tone et qui change de signe sur un intervalle [a,b] inclus dans I.
On sait qu’il existe une solution unique αà notre équation sur [a,b].
Soit mle centre de l’intervalle. Trois cas se rencontrent :
si f(m)=0 alors la vie est belle ;
si f(m) a le même signe que f(a) alors α[m,b] (pourquoi ?) ;
si f(m) a le même signe que f(b) alors α[a,m] (pourquoi ?) ;
On itère ce mécanisme jusqu’à obtenir un intervalle d’amplitude correspondant à la précision demandée sur α:
1 Algorithme impératif (ou itératif)
1.1 Version impérative
Listing 1: Algorithme impératif de dichotomie
1# -* - coding : Latin -1 -* # pour la gestion des a c cents
2def f(x):
3return x **3+ x +1
4
5A= input ("A=")
6B= input ("B=")
7E= input (" Precision = ")
8compteur =0 # on in i tia l ise le nombre d i téra t ion s
9
10 if f(A)*f(B) >= 0 :
11 print " Pas de r ac in e e nt re " ,A , " et " ,B
12 else:
13 while B -A >= E :
14 C =( A + B) /2.
15 if f(A)*f(C)<= 0 :
16 B=C
17 else :
18 A=C
19 compteur += 1 # on i ncr é ment e le compte u r d itér a tio n s
20 print " Une racine e ntre " ,A , " et " ,B , " avec " ,compteur ," itéra tions "
L’itération consiste à répéter plusieurs fois un sous-algorithme. Le nombre de répétitions peut être défini lors de la
rédaction de l’algorithme, mais on peut aussi indiquer à quelle condition l’itération doit se poursuivre ou non. Dans ce
cas il est nécessaire de s’assurer que la condition d’arrêt sera remplie au bout d’un nombre fini de tours de boucle pour
garantir que l’algorithme comporte un nombre fini d’étapes (condition de terminaison).
2 Algorithme récursif
Un algorithme est dit récursif lorsqu’il intervient dans sa description, c’est-à-dire lorsqu’il s’appelle lui-même.
La présentation récursive permet de présenter simplement des algorithmes beaucoup plus astucieux (et donc plus
efficaces) et cela a été admirablement montré par Tony Hoare avec son algorithme de tri rapide.
Très souvent un algorithme récursif est lié à une relation de récurrence permettant de calculer la valeur d’une fonction
pour un argument n à l’aide des valeurs de cette fonction pour des arguments inférieurs à n.
2.1 Exemple
Soit nun entier naturel non nul. Le nombre n×(n1)×...×2×1 est appelé factorielle n.
http://lycee.lagrave.free.fr 1/3
TP Programmation : algorithme de dichotomie : « impératif vs récursif » TS
On note
n!=n×(n1)×...×2×1
Conventionnellement, 0! =1. Et bien sûr n!=n×(n1)!
Listing 2: Algorithme récursif de la factorielle
1def fac torielle (n ):
2if n == 0:
3return 1
4return n * factorielle (n -1)
5
6N= input (" choix de l entier n : ")
7print N , "! = " ,factorielle(N)
2.2 Version récursive
Écrivez un algorithme récursif traduisant la dichotomie. On pourra s’inspirer du script suivant à compléter :
Listing 3: Algorithme récursif de dichotomie à compléter
1def f(x):
2return x **3+ x +1
3
4def zero (a ,b , pr ec ision ) :
5m = (a +b ) /2.
6if b - a < pre ci sion :
7return
8if :
9.
10 .
11 .
12 .
13 .
14 .
15 .
16 .
17 .
3 La boucle for
Écrivez un algorithme itératif de la factorielle. On pourra s’inspirer du script suivant à compléter :
Listing 4: Algorithme itératif de la factorielle à compléter
1def fac torielle (n ):
2fact = 1
3for kin range ( , ) :
4.
5.
6.
7.
8.
http://lycee.lagrave.free.fr 2/3
TP Programmation : algorithme de dichotomie : « impératif vs récursif » TS
4 Corrigés
Listing 5: Algorithme récursif de dichotomie
1def f(x):
2return x **3+ x +1
3
4def zero (a ,b , pr ec ision ) :
5m = (a +b ) /2.
6if b - a < pre ci sion :
7return m
8if f(a)*f(m) <= 0 :
9return zer o (a ,m , pre ci sion )
10 else :
11 return zer o (m ,b , pre ci sion )
12
13 A= input ("A=")
14 B= input ("B=")
15 E= input (" Precision = ")
16
17 print "Une racine proche de ", z ero ( A ,B , E)
Listing 6: Algorithme itératif de la factorielle
1def fac torielle (n ):
2fact = 1
3for kin r an ge (0 , n ) :
4fac t = fact *( k +1)
5return fact
6
7N= input (" choix de l entier n : ")
8print N , "! = " ,factorielle(N)
http://lycee.lagrave.free.fr 3/3
1 / 3 100%