Exercice 5 : Calcul des termes de la suite de Fibonacci.
La suite de Fibonacci est d´efinie par les relations : F0=F1= 1 et pour tout n≥0, Fn+2 =Fn+1 +Fn.
1) Ecrire un programme r´ecursif calculant Fnpour n≥0.
Correction : pas de nouveaut´es ! !
#let rec fibo n = match n with
| 0 −>1
| 1 −>1
|−>fibo (n-1) + fibo (n-2);;
D´eterminer le nombre d’appels `a la fonction selon n. On posera T(n) le nombre d’appels `a la fonction pour
le calcul de Fn, puis on donnera une relation entre T0(n) = T(n) + 1, T0(n−1) et T0(n−2) pour n≥2.
Correction : on a imm´ediatement que T(n) = 1 + T(n−1) + T(n−2) avec T(0) = T(1) = 1.
On en d´eduit que T0v´erifie la r´ecurrence de la suite de Fibonacci : T0(n) = T0(n−1) + T0(n−2), avec
T0(0) = T0(1) = 2. On en d´eduit que T(n) = √5
5+ 11+√5
2n+−√5
5+ 11−√5
2n+ 1.
2) Ecrire un programme r´ecursif calculant le couple (Fn−1, Fn).
D´eterminer le nombre d’appels `a la proc´edure selon n.
Correction :
#let fibo2 n =
let rec aux (a , b) n = match n with
dd| 1 -> (a,b)
dd| -> aux ( b , b + a ) (n-1);
in snd (aux (1,1) n);;
On a imm´ediatement nappels `a la fonction.
3) D´emontrer la relation : ∀(n, p)∈IN∗2,Fn+p=FnFp+Fn−1Fp−1.
En d´eduire un programme de calcul de Fnselon la m´ethode ”diviser pour r´egner”.
D´eterminer le nombre d’appels `a la proc´edure selon n.
Correction : ce fait par r´ecurrence double sur p(ou sur n).
Pour la fonction il faudra distinguer le cas npair et nimpair.
On a en effet : F2n=F2
n+F2
n−1,F2n−1=Fn−1(2Fn−Fn−1) et F2n+1 =Fn(Fn+ 2Fn−1).
On va encore calculer les couples Tn= (Fn−1, Fn).
On a T2n=Fn−1(2Fn−Fn−1), F 2
n+F2
n−1et T2n+1 =F2
n+F2
n−1, Fn(Fn+ 2Fn−1).
#let fibo3 n =
let rec aux n = match n with
dd| 0 −>(0,1)
dd| 1 −>(1,1)
dd|−>let (a,b) = aux (n/2) in
ddddif n mod 2 = 0 then (a*(2*b-a),a*a+b*b)
ddddddddelse (a*a +b*b, b*(b+2*a))
ddddin snd (aux n);;
Le nombre d’appel `a la fonction v´erifie Cn= 1 + Cbn/2cet C1= 1, d’o`u Cn= 1 + blog2(n)c
Exercice 6 : Une m´ediane d’un ensemble Ede cardinal nest un ´el´ement m∈Etel que
Card {x∈E/x < m}=jn
2k
1) Montrer l’unicit´e de la m´ediane d’un ensemble.
Correction : Pour m<m0on a m∈ {x∈E/x < m0}, d’o`u
Card {x∈E/x < m}+ 1 6Card {x∈E/x < m0}
On en d´eduit que Card {x∈E/x < m}+ 1 6=Card {x∈E/x < m0}et donc met m0ne peuvent ˆetre
simultan´ement m´ediane, d’o`u l’unicit´e.
2) Donner un algorithme de complexit´e Θ(n2) (mesur´ee en comparaisons) pour trouver la m´ediane d’un tableau.
Correction : On parcourt le tableau et, pour chaque ´el´ement, on compte le nombre d’´el´ements qui lui sont
strictement inf´erieurs. On renvoie l’´el´ement pour le quel ce nombre est n
2.
#let mediane t =
ddddlet n = vect length t and i = ref 0 and res = ref 0 and compte = ref 0 in
ddddwhile (!i < n) do
2