Pour continuer dans la lignée du premier tuto, voyons les méthodes récursives.
Résumons vite les 4 premiers cas généraux abordés dans le précédent tuto sur les méthodes (simples) avant de commencer .
Une méthode peut retourner 1) Une variable ou un nombre. return 3; ou
return maVariable;2) Le résultat d'un calcul (composés de variables, nombres, ...). - Code:
-
private int doubler(int monNombre)
{
return monNombre * 2;
}
3) Le résultat d'un test logique - Code:
-
private int estDivisibleParDeux(int nombre)
{
return ((nombre % 2) == 0);
}
4) Le résultat d'une autre méthode - Code:
-
// Retourne un en-tête en fonction du sexe du destinataire
private string entete(string destinataire, char sexe)
{
if(sexe == 'F')
{
return "Chère " + destinataire;
}
else
{
return "Cher " + destinataire;
}
}
// Retourne une signature en ajoutant une salutation
private string salutations(string nom, string prenom)
{
return "Bien à vous,\n\n\t" + nom + prenom;
}
// Retourne la lettre complète à partir des éléments donnés en utilisant les deux fonctions ci-dessus
private string creerLettre(string destinataireLettre, string sexeDest, string nomAuteur, string prenomAuteur, string message)
{
return entete(destinataireLettre, sexeDest) + "\n\n" + message + "\n\n" + salutations(nomAuteur, prenomAuteur);
}
(J'ai différenciés les noms de variables récupérés dans creerLettre par rapport aux deux autres méthodes qu'elle utilisise pour faciliter la compréhension, mais les noms peuvent être les mêmes car ils s'agit de variables locales à la fonction qu'elle "habite").
Commencons maintenant les méthodes récursives, véritable but de ce tuto5) Se retourner elle-même...C'est ici que ça devient un peu plus chaud je pense
Il s'agit donc de
RécursivitéPrenons le simple exemple de cette méthode qui calcule la factorielle de
n (noté
n!)
L'on peut donc créer la méthode suivante qui est une méthode
itérative:
- Code:
-
private int factorielle(int n)
{
int res = 1;
for (int i = 1 ; i <= n ; i++)
{
res = res*i;
}
return res;
}
Rappel : Factorielle de 3 = 1 * 2 * 3Maintenant d'autres penserons d'une autre manière et préféreront faire une méthode récursive (qui s'appelle elle-même) :
- Code:
-
private int sommeCumulée(int n)
{
return ((n==0)? 0 : n + sommeCumulée(n-1));
}
Traduction : Si n est égal à zéro, on retourne 0, le cas contraire, on retourne n à quoi l'on rajoute le résultate de la méthode
SommeCumulée à laquelle on passe en paramètre n soustrait de un.
Plus simplement, on va ajouter les nombres uns à uns en commencant par 'n' et en terminant par 0.
Bref je sais que c'est pas toujours facile à comprendre au premier abord, si c'est le cas, faites quelques tests, et ça ira mieux ^^
Pour terminer, quel est l'avantage de la récursivité... ?
Il permet dans certains cas une complexité moins importante (parfois le contraire attention !). Ici dans les deux méthodes sommeCumulée, la complexité est la même (
O(n)). En gros il va faire n fois quelque chose, donc ici faites comme vous le voulez.
Par contre prenons l'exemple d'une méthode récursive calculant un nombre de la suite de fibonacci donné à 'n' position :
- Code:
-
private int fibonacci(int n)
{
return ((n==0)? 0 :((n==1)? 1 : fibonacci(n-1) + fibonacci(n-2)));
}
Nous avons là une récursivité monstrueuse !! De complexité O(n²). Donc à éviter à tout prix. Une solution mathématique sera meilleure dans ce cas là ^^ (petit défi : trouvez la formule qui donne le nombre à la position n dans la suite de fibonacci
)
On pourrait s'étendre sur le sujet encore un peu mais ça devient trop technique et ça ne servirait à rien dans le cadre souhaité ici
Voilà, donc je vous souhaite une bonne récursivisisation