Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi Eclipse MS-Office SQL & SGBD Oracle  4D  Business Intelligence
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
FORUM PHP FAQ PHP COURS PHP SOURCES PHP LIVRES PHP SCRIPTS PHP OUTILS PHP COMPARATIFS PHP TV Zend Framework

Qu'est ce que la programmation itérative et récursive, comment l'appliquer en PHP.

Date de publication : 10/05/2005 , Date de mise a jour : 14/07/2005

Par Genova (Autres articles)
 

Découvrez deux méthodes en programmation qui vous permettront d'optimiser vos fonctions.


Introduction
1. Programmation itérative
2. Programmation récursive


Introduction

L'iteratif et le recursif sont deux facons de programmer, tres utiles, que je vais tenter de vous expliquer. Ces deux types sont utiles notamment pour effectuer un certain nombre de fois (qu'on ne peut déterminer a l'avance) un certain script, et donc permettent une optimisation du code. Si l'iteratif est relativement facile à comprendre, je vous conseille de passer un peu plus de temps sur le recursif qui est un concept pas forcement évident au début. Une fois que vous maîtriserez ces deux concepts de nombreuses percpectives d'optimisations s'ouvriront à vous.


1. Programmation itérative

La programmation iterative est une méthode permettant de répéter un certain nombre d'action un certain nombre de fois, à l'aide d'une boucle et d'une variable qui s'incrémentera à chaque passage (on appelle généralement cette variable $i). La façon la plus simple pour apprendre est avec un exemple. Nous allons créer une fonction my_pow($nombre, $puissance) qui permettra d'élever le nombre $nombre à la puissance $puissance. Mathématiquement que se passe t'il ? Si on prend 3 puissance 4 par exemple, cela équivaut à 3 * 3 * 3 * 3]. Nous allons donc répéter 4 fois ($puissance) la multiplication de $nombre (qui vaut 3 dans notre exemple) par lui meme. Voici la fonction finale :

function my_pow($nombre, $puissance) { // Par convention si la puissance est negative on retourne 0 ici, en effet nous // ne travaillerons ici que sur les entiers. if ($puissance < 0) { return (0); } // On donne comme valeur au $ resultat 1 a la base, comme ca si jamais on a un nombre // a la puissance 0 la boucle ne se passera pas et on renvera 1, sachant qu'un // nombre puissance 0 vaut 1 $resultat = 1; // On lance la boucle, a chaque passage on multiplie $resultat par le nombre, // et cela tant que $i est inferieur a $puissance for ($i = 0; $i < $puissance; $i++) { $resultat *= $nombre; // equivaut a $resultat = $resultat * $nombre; } return ($resultat); }
Pour l'utilisation, faites :

// Affichera 3 a la puissance 4, soit 81 echo my_pow(3, 4);

2. Programmation récursive

La programmation recursive est une autre méthode permettant de répéter un nombre indéterminé de fois une action. on crée une fonction qui va effectuer une action. Dans cette fonction nous plaçons une condition. Si cette condition est vraie on appelle la fonction à nouveau en son sein même, si c'est faux on sort avec un return. On va ainsi répéter la fonction tant que la condition est vraie. Pour bien comprendre nous allons étudier deux exemples significatifs. Le premier est une fonction qui permet de lister le contenu d'un répertoire, et de tout ses sous-répertoires, ainsi que tout les sous-répertoires des sous-répertoires, etc... Tant qu'il y a des répertoires quoi :), On va donc créer une fonction my_dossier($dir) qui va lister le répertoire qu'il prend comme paramètre. Si on rencontre un répertoire dans ce listage, on appelle à nouveau la fonction avec ce répertoire rencontré, etc... Voici le code :

function my_dossier($dir) { // On ouvre le dossier $fd = opendir($dir); // On liste le dossier while ($file = readdir($fd)) { // Si le fichier parcouru est un dossier... if (is_dir($dir . $file)) { // ...alors on affiche ce dossier en gras et on repete la fonction // pour ce dossier. echo '<b>Dossier :: ' . $dir . $file . '/</b><br />'; my_dossier($dir . $file . '/'); } else { // Sinon on affiche en normal le fichier echo 'Fichier :: ' . $dir . $file . '<br />'; } } closedir($fd); }
Bien entendu je ne prend pas en compte pour ce premier exemple l'indentation (tabulation) entre les différents dossiers, je vous laisse le faire ;) Pour le second exemple nous allons recoder la fonction print_r($tab) qui affiche récursivement un tableau de données. Nous allons donc parcourir les éléments de ce tableau, et à chaque sous-tableau rencontré on répète la fonction.

function my_print_r($tab) { // On est au tout debut d'un tableau donc on affiche array( echo 'array(<br />'; // On parcourt le tableau foreach ($tab AS $key => $value) { // Si la valeur courante est un tableau... if (is_array($value)) { // On parcourt le sous tableau rencontre my_print_r($value); } else { // On affiche la cle et la valeur courante echo '\'' . $key . '\' => \'' . addslashes($value) . '\',<br />'; } // On a fini de parcourir le tableau... echo '),<br />'; } }
Je vous laisse là aussi paginer les tabulations. Bon allez pour finir un petit exercice pas bien compliqué, essayez de refaire la fonction de l'exercice 1, la fonction des puissances qu'on a codé itérativement, refaites la en récursif ;)



Les sources présentés sur cette pages sont libre de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright Genova. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérets.
Responsable bénévole de la rubrique PHP : Guillaume Rossolini (Yogui) - Contacter par EMail :
Vos questions techniques : forum d'entraide PHP - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.