Pierre-Louis CAYREL 2008-2009
Pr´epa HEC 2 disponible surwww.cayrel.net
Lyc´ee Lavoisier Feuille n◦6
Fonctions et r´ ecursivit´ e II
Exercice 1 Une suite (un)n∈N est dite lin´eaire double si elle d´efinie par la connaissance de ses deux premiers termes et par une relation de r´ecurrence du type :
un+2 =aun+1+bun.
Posons u0 = 1 et u1 = 1. Apr`es avoir choisit une valeur de n, correspondant au nombre de termes de la suite `a calculer, ´ecrire un programme r´ecursif qui calcule et affiche les n premiers termes.
Exercice 2 (Suite de Fibonacci) On consid`ere la suite d´efinie ainsi : U0 = 1
U1 = 1
Un=Un−1+Un−2
Ecrire les deux fonctions´ fibo_rec et fibo_iter qui prennent toutes les deux en entr´ee un entier n et rendent en sortie la valeur du n-i`eme terme de la suite ; la premi`ere proc´edant de mani`ere r´ecursive, la seconde de mani`ere it´erative.
Exercice 3 Ecrire une fonction qui rende la valeur de´ nk
sans utiliser cette fois-ci la fonction factorielle, mais `a partir de la relation :
n
k
=
n−1
k−1
+
n−1
k
En remarquant bien que :
– n doit ˆetre sup´erieur ou ´egal `ak;
– n0
= 1;
– kk
= 1.
Exercice 4 Ecrire un programme qui :´
– initialiser le polynˆome dividende (de degr´e inf´erieur ou ´egal `a n) ;
– initialiser le polynˆome diviseur (de degr´e inf´erieur au degr´e du dividende) ; – rendre le polynˆome quotient et le polynˆome reste.
1
Pierre-Louis CAYREL 2008-2009
Pr´epa HEC 2 disponible surwww.cayrel.net
Lyc´ee Lavoisier Feuille n◦6
Fonctions et r´ ecursivit´ e II
Correction 1
PROGRAM suite_lineaire_double;
VAR n,k : integer;
FUNCTION U(n : integer) : real;
Begin
if (n = 0) or (n = 1) then U := 1;
else U := a * U(n-1) + b * U(n-2);
end;
Begin
writeln(’donner les valeurs de a et b’);
readln(a,b);
writeln(’donner le nombre de termes d´esira n’);
read(n);
for k := 0 to n
do writeln(’U(’,k,’)=’,U(k));
readln End.
Correction 2
FUNCTION fibo_rec(n : integer) : integer;
begin
if (n = 0) or (n = 1) then fibo_rec := 1
else fibo_rec := fibo_rec(n-1) + fibo_rec(n-2) end;
et
FUNCTION fibo_iter(n : integer) : integer;
VAR rang_moins_1, rang_moins_2, terme : longint;
i : integer;
begin
rang_moins_1 := 1;
rang_moins_2 := 1;
1
for i := 2 to n do
begin
terme := rang_moins_1 + rang_moins_2;
rang_moins_1 := terme;
rang_moins_2 := rang_moins_1;
end;
fibo_iter := terme;
end;
Correction 3
FUNCTION combi(n,k : integer) : integer;
Begin
if n > k
then if k = 0
then combi := 1
else combi := combi(n-1,k-1) + combi(n-1,k) else if n = k
then combi := 1
else writeln(’erreur dans le choix de vos coefficients’);
end;
Correction 4
Program division_poly;
const n=10;
type tpoly = array[0..n+1] of real;
var polynome, dividende, quotient, diviseur, reste : tpoly;
i : integer;
function degre(p : tpoly) : integer;
Begin
degre := trunc(p[0]) End;
procedure initialisation(var p : tpoly);
var k : integer;
Begin
writeln(’quel est le degr´e du polyn^ome’);
readln(k);
p[0] := k;
for k := 1 to degre(p) + 1 do
Begin
writeln(’quel est e terme de degr´e’,k-1);
readln(p[k]);
2
end;
end;
procedure recitation(p : tpoly);
var k : integer;
Begin
for k := 1 to degre(p)+1 do write(p[k],’’);
writeln;
end;
procedure division(var p,q : tpoly; d : tpoly);
var i : integer;
Begin
if degre(p) >= degre(d) then
Begin
q[degre(p) - degre(d) + 1] := p[degre(p) + 1] / d[degre(d) + 1];
for i := degre(d) + 1 downto 1 do
p[degre(p) - degre(d) + i] := p[degre(p) - degre(d) + i]
- q[degre(p) - degre(d) + 1] * d[i];
p[0] := p[0] - 1;
division(p,q,d);
end;
end;
Begin
initialisation(polynome);
initialisation(diviseur);
dividende:= polynome;
quotient[0] := (degre(polynome) - degre(diviseur))/1;
writeln(’le degre du quotient est’, degre(quotient));
division(dividende, quotient, diviseur);
writeln(’polynome ’);recitation(polynome);
writeln(’diviseur ’);recitation(diviseur);
writeln(’quotient ’);recitation(quotient);
writeln(’reste ’);recitation(reste);
readln end.
3