Vous êtes sur la page 1sur 7

Lyce Secondaire Aljawhara

Classes 4 Sc.info 1 & 2

Chap-II- La rcursivit : Correction dexercices Exercice N1 : function fibonacci ( n : integer ) : integer; (* calcule le nme nombre de Fibonacci, n tant donn en paramtre *) begin (* fibonacci *) if n = 0 then (* cas de F0 *) fibonacci := 0 else if n = 1 then (* cas de F1 *) fibonacci := 1 else (* tous les autres cas *) fibonacci := fibonacci ( n - 1 ) fibonacci ( n - ! ); (* appels rcursifs *) end; (* fibonacci *) F4=3 F3=2 F1+F2 1 F1 F0 1 "ombre d#appel= $ Exercice N2 : 0) 1) #olution $t%rati&e Fonction puissance (% :rel ;n :entier) :rel &1 &our i de 1 ' ()*(n) faire & p*% Finpour *i (n+0) alors p(1,p) finsi &uissancep Fin puissance #olution r%cursi&e 0) Fonction puissance (% :rel ;n :entier) :rel 1) *i n=0 alors &uissance1 *inon si (n.0) alors &uissance %*puissance(%,n-1) *inon puissance(1,%) * puissance(%,n 1) ,, ou puissance1, puissance(%,-n) ,, finsi finsi !) Fin puissance #olution r%cursi&e 0) Fonction produit (a,b :entier) :entier 1) *i b=0 alors &roduit0 *inon si (b.0) alors &roduit a produit(a,b-1) *inon &roduit -produit(a,-b) Finsi finsi !) Fin produit 0 F3 + F1+F2 1 F1 F0 F2 F4+F3 F1 F0 1 + 0 Nombre da el = !+4+2=14

F"

1 0 Nombre da el = !

!) -) $)

Exercice N3 : #olution $t%rati&e 0) Fonction produit (a,b :entier) :entier 1) s0 &our i de 1 ' ()*(b) faire s s a Finpour !) *i (b+0) alors s - s finsi -) produits $) Fin produit

' 1() '

Exercice N4 : #olution $t%rati&e 0) Fonction &&/0 (a,b :entier) :entier 1) *i (a.b) alors 0a%a 0inb *inon 0a%b 0ina finsi !) 1ant 2ue (ma% mod min +.0) faire 0a% ma% (a b)-min) Fin tant 2ue -) &&/0ma% $) Fin &&/0 Exercice N5 : procedure compter ( nombre : 5#appel integer ); affic7er: 3ar i : integer; 1 begin ! for i:=1 to n do 4riteln ( i ); end; $ 6 compter(6) 3a procedure compter8rec ( i,n : integer ); (* destine ' illustrer ce 2u9est un appel rcursif *) begin if i+=n t7en begin 4riteln ( i ); compter(i 1,n); end; end; l#appel se fait compte(1,n) #olution r%cursi&e 0) Fonction &&/0 (a,b,ma%,min :entier) :entier 1) *i (ma% mod min=0) alors &&/0ma% *inon &&/0&&/0(a,b,ma% (a b)min,min) Finsi !) Fin &&/0

Exercice N

: if b+10 t7en begin 4rite(a*10 b:$); affic7e(a,b 1); end else begin 4riteln; affic7e(a 1,0); end; end;

*uite ' l#appel affic7e (0,0) cette procdure donne l#affic7age sui3ant :

:n utilisant la rcursi3it cette procdure de3ient : procedure affic7e (a,b:integer); begin if a+$ t7en Exercice N! :
0 -1

1- l9effet 3isible sera l9affic7age sui3ant: !- 2ue se passe-t-il plus prcisment; 1< 59appel initial ( exemple ( -! ); ) cre une =one mmoire contenant les 3aleurs de nombre et resultat ' sa3oir -! et indfini ainsi 2ue l9adresse de reprise utilise pour retourner au programme appelant< (ppelons >1 cette =one mmoire< !< 59instruction resultat := nombre + 1; fait 2ue >1 contient les 3aleurs -! et -1< -< 59instruction if est e%cute et l9appel rcursif a lieu: ' 2() '

- >1 de3ient inaccessible< - une nou3elle =one >! est cre en mmoire< >! contient les 3aleurs des nou3eau% nombre et resultat ' sa3oir -1 et indfini ainsi 2ue l9adresse de reprise, c9est-'-dire l9adresse de l9instruction sui3ante ' e%cuter ( writeln ( resultat ); )< - l9e%cution reprend au dbut du code de la procdure exemple < $< 59instruction resultat := nombre + 1 ; fait 2ue >! contient les 3aleurs -1 et 0< 6< 59instruction if n9est pas e%cute (resultat 3aut 0)< ?< 59instruction 4riteln ( resultat ); est e%cute (affic7age de la 3aleur 0) @< 59appel rcursif se termine: - l9e%cution reprend ' l9instruction dont l9adresse est contenue dans >! ( adresse de reprise ) ' sa3oir writeln ( resultat ); ( 3oir point - )< - >! est dtruite et >1 rede3ient accessible< A< 59instruction writeln ( resultat ); est e%cute (affic7age de la 3aleur -1) B< 59appel initial e%emple ( -! ); se termine< Cn peut dire 2ue les =ones >1 et >! sont empiles< 59accs au% obDets nombre et resultat se fait touDours dans la =one situe au sommet de la pileE Exercice N" : #olution $t%rati&e function premier (":integer):boolean; 3ar c:integer; begin c:=!; 47ile ((n mod c +.0) and (c+=s2rt(n))) do c:=c 1; if (c.s2rt(n)) t7en premier:=true else premier:=false; end; Exercice N* : #olution $t%rati&e 0) procdure fact8prem(n :entiers) 1) i ! rpter tant2ue (n mod i=0) faire :crire(i) " " di3 i Fintant2ue F i 1 Gus2u#' ("+=!) !) Fin fact8prem #olution r%cursi&e 0) procdure fact8prem(n,% :entiers) 1) si (n=1) alors :crire(n) sinon si (n mod %=0) alors ecrire(%) fact8prem(n di3 %,%) sinon fact8prem(n,% 1) finsi finsi !) Fin fact8prem #$ %appe% se &ait &act+pre'#n(2) $) Exercice N1,: -cursivit directe : #olution $t%rati&e ' 3() ' #olution r%cursi&e #olution r%cursi&e function premier(n,%:integer):boolean; begin if %+=n di3 ! t7en begin if n mod %=0 t7en premier:=false else premier:=premier(n,% 1); end else premier:=true; end; #$ %appe% se &ait pre'ier#n(2) $)

0) Fonction pair (n :entier) :boolen 0) Fonction pair (n :entier) :boolen 1) 1ant2ue (n .=!) faire 1) *i (n=0) alors pair 3rai " n-! *inon *i (n=1) Fintant2ue alors pair fau% !) *i (n=0) alors pair 3rai *inon pair pair(n-!) *inon pair fau% finsi Finsi Finsi -) Fin pair !) Fin pair $) Fonction impair (n :entier) :boolen -) Fonction impair (n :entier) :boolen 6) 1ant2ue (n .=!) faire $) *i (n=1) alors impair 3rai " n-! *inon *i (n=0) alors impair fau% Fintant2ue *inon impair impair(n-!) ?) *i (n=1) alors impair 3rai finsi *inon impair fau% Finsi Finsi 6) Fin impair @) Fin impair -cursivit croise *arit% crois%e function impair (n:integer):boolean; function pair (n:integer):boolean; begin if (n=0) t7en pair:=true else if (n=1) t7en pair:=false else pair:=impair(n-1); end; begin if (n=1) t7en impair:=true else impair:=pair(n-1); end; Exercice N11 : #olution $t%rati&e function in3erse(st: string): string; 3ar au%: string; i: integer; begin au% := 99; for i := 1 to lengt7(st) do au% := stHiI au%; in3erse := au%; end; Exercice N12 : ANAGRAMMES *upposons 2u9on 3euille faire un programme 2ui affic7e les combinaisons d9une c7aKne de caractres ; par e%emple les anagrammes des lettres de LabcL sont Labc , acb , bac , bca , cab , cbaL< Mne solution ' ce problme, est la sui3ante : on prend un mot et on permute sa premire lettre a3ec c7acune des autres lettres< :nsuite pour c7acun des nou3eau% mots obtenus, on ne touc7e pas ' la premire lettre et ' partir de la deu%ime lettre on refait les permutations entre la deu%ime lettre et toutes les autres lettres Dus2u9' la fin; ensuite pour c7acun des nou3eau% mots obtenus, on ne touc7e pas ' la deu%ime lettre et ' partir de la troisime lettre on refait les permutations entre la troisime lettre et toutes les autres lettres Dus2u9' la fin; on 3oit donc la rcursi3it: rogram combinaisons ; uses +incrt; ' 4() ' #olution r%cursi&e function in3erse(st: string): string; begin if st = 99 t7en in3erse := 99 else in3erse := stHlengt7(st)I in3erse(copJ(st, 1, lengt7(st) - 1)); end;

&ar ch , string ; l , b-te ; rocedure .change/ar 0&ar ch , string ; i1 2 , b-te); &ar car , char ; begin if i 34 2 then begin car ,=ch5i6 ; ch5i6,=ch526 ; ch526,=car ; end end ; rocedure anagram 0ch , string ; i , b-te); &ar 2 , b-te ; Exercice N13 :

begin if i = l then +riteln0ch) else for 2 ,= i to l do begin .change/ar 0ch1i12) ; 7nagram 0ch1i+1) ; .change/ar 0ch1i12) ; end ; end ; begin readln0ch) ;l,=length0ch) ; anagram0ch11) ; end 8

E AL!A"#$N %&!NE C'A#NE %E CARAC"ERES ($RMEE %&!NE A%%#"#$N %E N$M)RES *oit une c7aKne de caractres du tJpe Ls:=96 - $ @9 ;L ;faisons le programme 2ui 3alue cette c7aKne de caractres< NoJons l9algorit7me de cette procdure : - d9abord on sait 2ue la 3aleur d9une c7aKne 3ide est 0 - ensuite on sait 3aluer un nombre seul a3ec la procdure pascal L3alL< - on sait e%traire une sous c7aKne a3ec la fonction LcopJL et nous allons e%traire des caractres Dus2u9au premier signe L L - l93aluation de la c7aKne initiale est gale ' la 3aleur du nombre e%trait plus la 3aleur de la c7aKne restante (appel rcursif)< Noici le programme correspondant : re eat inc0i) until 0i4length0st)) or 0st5i6=9+9) ; function e&al0st , string) , integer ; &al0co -0st111i'1)1a1e) ; &ar a1i1e, integer ; delete0st111i'1) ; begin e&al,=a+e&al0st) if length0st)=0 then end ; e&al,=0 end ; else Cn appelle cette fonction de la faOon sui3ante : begin b:=e3al(c7) ; a3ec c7 de la forme : 96 - $ @9 i,=1 ; Exercice 4 p *1 du %ivre function pair8c(c7:string;c:c7ar):boolean; begin if c7=99 t7en pair8c:=true else if (c7H1I=c) t7en pair8c:=not (pair8c(copJ(c7,!,lengt7(c7)-1),c)) else pair8c:= pair8c(copJ(c7,!,lengt7(c7)-1),c); end; Exercice N14 : #olution $t%rati&e 0) fonction contigus(c7 :string) :boolen 1) i 1 , trou3efau% !) rpter si (c7HiI =c7Hi 1I) alors trou3e 3rai sinon i i 1 finsi Dus2u#' (trou3e) ou (i=long(c7)) #olution r%cursi&e 0) fonction contigus(c7 :string) :boolen 1) si long(c7)+=1 alors contigus fau% sinon si (c7H1I =c7H!I) alors contigus 3rai sinon contigus contigus(sous8c7aine(c7,!,long(c7)-1)) finsi !) fin contigus ' "() '

-) contigus trou3e $) fin contigus Exercices N15 : 0) procdure remplir (3ar t :tab ;d,f :entier) 1) si (d+=f) alors lire(tHdI) remplir(t,d 1,f) finsi !) fin remplir

l#appel sera remplir(t,1,n)

Exercices N1

#olution $t%rati&e #olution r%cursi&e 0) fonction 0) fonction rec78se2(t :tab ;n :entier ;3 :tJp8elem) :boolen rec78se2(t :tab ;d,f:entier ;3 :tJp8elem) :boole n 1) trou3e fau%, i1 rpter 1) si (d.f) alors rec78se2fau% si tHiI=3 alors trou3e 3rai sinon si(tHdI=3) alors rec78se23rai sinon sinon ii 1 finsi rec78se2 rec78se2(t,d 1,f, Dus2u#' (trou3e) ou (i.n) 3) finsi !) rec78se2 trou3e finsi !) fin rec78se2 l#appel se fait rec78se2(t,1,n,3) Exercices N1! : #olution $t%rati&e -) fonction rec78dict(t :tab ;n :entier ;3 :tJp8elem) :boole n $) d1,fn rpter m(d f) di3 ! si tHmI.3 alors d m-1 sinon fm 1 finsi Dus2u#' (tHmI=3) ou (d.f) 6) si (tHmI=3) alors rec78dict 3rai sinon rec78dict fau% finsi fin rec78dict #olution r%cursi&e 0) fonction rec78dict(t :tab ;d,f:entier ;3:tJp8elem) :boole n 1) m(d f) di3 ! !) si (tHmI=3) alors rec78dict 3rai sinon si (d.f) alors rec78dictfau% sinon si tHmI.3 alors rec78dict rec78dict(t,d,m1,3) sinon rec78dictrec78dict(t,m 1,f,3) finsi finsi finsi -) fin rec78dict l#appel se fait rec78dict(t,1,n,3)

Exercices N1" : 0) &rocedure tri8sel(3ar t :tab ;deb,fin :entier) 1) *i (deb+fin) alors &ma% posma%(t,deb,fin) *i tHpma%I.tHdebI alors ' :() '

&ermuter(tHdebI,tHpma%I) Finsi 1ris8sel(t,deb 1,fin) Finsi !) Fin tri8sel

l#appel sera tri8sel(t,1,n)

' )() '

Vous aimerez peut-être aussi