La récursivité
1.Définition.
2. Exemples.
3. la récursivité croisée.
******************************************************
1.Définition:
Une fonction ou une procédure récursive est une fonction qui s'appelle elle même. À chaque appel récursif d’une procédure ou d’une fonction, de nouvelles variables locales sont créées et les résultats correspondants sont empilés, de sorte que le résultat du dernier appel demeure le premier qui soit accessible.
Exemple : La somme de nombres Somme(n) = n + Somme(n – 1)
Pour que cette définition soit consistante, il faut poser que : Somme(0) = 0 FUNCTION Somme(Nombre : INTEGER) : INTEGER;
BEGIN
IF Nombre = 0 THEN Somme := 0
ELSE Somme := Nombre + Somme(Nombre – 1);
END;
2.Exemples de traitements récursifs:
2.1. Le produit de nombres:
Le produit des 10 premiers entiers, par exemple, est égal à 10 fois le produit des neuf entiers qui précèdent le nombre 10. Tout comme la somme, pour que cette définition soit consistante, il faut poser que : Fact(0) = 1 :
Toujours bien spécifier le cas de base qui constitue la condition d’arrêt de la récursivité
fonction factorielle (n: Naturel) : Naturel début
si n = 0 alors factorielle←1 sinon
factorielle← n * factorielle ( n-1) ; Finsi
Fin.
Afin d’éviter des boucles infinies il convient:
– De définir la condition d’arrêt que l’on testera avant l’appel récursif.
– De s’assurer que l’on converge bien vers la condition d ’arrêt grâce aux paramètres.
– De ne pas oublier que la valeur des paramètres est fixée par l’appelant.
Le raisonnement itératif :
Expliciter dans le schéma de l’algorithme que l’on résoud un problème en N étapes, au cours desquelles le même travail est réalisé sur des variables différentes.
Le raisonnement récursif :
Expliciter dans le schéma de l’algorithme la spécificité de la Nième étape, exprimée en faisant appel globalement au travail réalisé par ce même algorithme au cours des N-1 autres étapes.
Remarques sur la récursivité
La récursivité peut simplifier considérablement certains problèmes.
Un appel de fonction/procédure à un coût non négligeable. Les programmes récursifs sont souvent plus coûteux que leurs homologues non récursifs.
2.2. le PGCD :
Calcul du Plus Grand Commun Diviseur (PGCD) de deux nombres :
• Définition mathématique : Soient deux nombres a et b. Si a est positif, le PGCD de a et de 0 est a ; Si b est strictement positif et a est positif, le PGCD de a et b est égal au PGCDD de b et du reste de la division entière de a par b.
• Exemple A=30, b=18
PGCD (30,18) = PGCD(18,12) = PGCD(12,6) = PGCD(6,0)Le PGCD de 30 et de 18 est donc égal à 6
• Algorithme
Fonction PGCD(A,B) : entier Début
Si (B = 0) alors PGCDß A Sinon
PGCDß PGCD (B, A mod B) Fin de Si
Fin
2.3 .Puissance d’un nombre :
Fonction PUISSANCE (x, puiss) :entier
Début
Si (puiss = 0) alors {condition d’arrêt}
Puissance← 1 Sinon
Puissance← x*Puissance (x, puiss-1);
FSi Fin.
2.4
suite de Fibonacci
function Fibonacci(N: NATURAL) : integer
begin
if N<=1 then
Fibonacci:= 1
Else Fibonacci := Fibonacci(N-1)+Fibonacci(N-2);
end;
Modifiez la fonction de manière à afficher la valeur de l'argument N pour chaque appel récursif, ainsi que le nombre total d'appels récursifs.
3.La récursivité croisée
Trace d'exécution:
Un 6
Program RecursiviteCroisee ; Procedure Un ( Var N : Integer ) ; Begin
Writeln ( 'Un' ,N ) ; If N > 0 Then Begin
N := N - 1 ; Deux ( N ) End
End ;
Deux 5
Un 4
Procedure Deux ( Var N : Integer ) ; Begin
Writeln ( 'Deux ’, N) ; If N > 0 Then
Begin N := N - 1 ; Un ( N ) End End ;
Var n : Integer ;
Begin n := 6 ; Un ( n ) End.
Deux 3
Un 2
Deux 1
Un 0