TS algorithme de dichotomie

publicité
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 f une fonction continue, strictement monotone 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 m le 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
2
3
# -* - coding : Latin -1 -* # pour la gestion des accents
def f ( x ) :
return x **3+ x +1
4
5
6
7
8
A = input ( " A = " )
B = input ( " B = " )
E = input ( " Precision = " )
compteur =0 # on initialise le nombre d ’ itérations
9
10
11
12
13
14
15
16
17
18
19
20
if f ( A ) * f ( B ) >= 0 :
print " Pas de racine entre " ,A , " et " ,B
else :
while B - A >= E :
C =( A + B ) /2.
if f ( A ) * f ( C ) <= 0 :
B=C
else :
A=C
compteur += 1 # on incrémente le compteur d ’ itérations
print " Une racine entre " ,A , " et " ,B , " avec " , compteur , " itérations "
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 n un entier naturel non nul. Le nombre n × (n − 1) × . . . × 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 × (n − 1) × . . . × 2 × 1
Conventionnellement, 0! = 1. Et bien sûr
n! = n × (n − 1)!
Listing 2: Algorithme récursif de la factorielle
1
2
3
4
def factorielle ( n ) :
if n == 0:
return 1
return n * factorielle (n -1)
5
6
7
N = input ( " choix de l ’ entier n : " )
print 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
1
2
def f ( x ) :
return x **3+ x +1
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def zero (a ,b , precision ) :
m = ( a + b ) /2.
if b - a < precision :
return
if
:
.
.
.
.
.
.
.
.
.
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
1
2
3
4
5
6
7
8
def factorielle ( n ) :
fact = 1
for k in range ( , ) :
.
.
.
.
.
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
1
2
def f ( x ) :
return x **3+ x +1
3
4
5
6
7
8
9
10
11
def zero (a ,b , precision ) :
m = ( a + b ) /2.
if b - a < precision :
return m
if f ( a ) * f ( m ) <= 0 :
return zero (a ,m , precision )
else :
return zero (m ,b , precision )
12
13
14
15
A = input ( " A = " )
B = input ( " B = " )
E = input ( " Precision = " )
16
17
print " Une racine proche de " , zero (A ,B , E )
Listing 6: Algorithme itératif de la factorielle
1
2
3
4
5
def factorielle ( n ) :
fact = 1
for k in range (0 , n ) :
fact = fact *( k +1)
return fact
6
7
8
N = input ( " choix de l ’ entier n : " )
print N , " ! = " , factorielle ( N )
http://lycee.lagrave.free.fr
3/3
Téléchargement