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

Genova

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

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

- Auteur : Genova

- Parution : 10 mai 2005

- Mise à jour : 4 décembre 2019

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 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'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Programmation itérative

- III. Programmation récursive

I - Introduction

L'itératif et le récursif sont deux façons de programmer, très 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 à l'avance) un certain script, et donc permettre une optimisation du code. Si l'itératif est relativement facile à comprendre, je vous conseille de passer un peu plus de temps sur le récursif qui est un concept pas forcément évident au début. Une fois que vous maîtriserez ces deux concepts, de nombreuses perspectives d'optimisations s'ouvriront à vous.

II - Programmation itérative

La programmation itérative est une méthode permettant de répéter un certain nombre d'actions 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-même. Voici la fonction finale :

function my_pow($nombre, $puissance)

{

// Par convention si la puissance est négative 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 à la base, comme ça si jamais on a un nombre

// à la puissance 0 la boucle ne se passera pas et on renverra 1, sachant qu'un

// nombre puissance 0 vaut 1

$resultat = 1;

// On lance la boucle, à chaque passage on multiplie $resultat par le nombre,

// et cela tant que $i est inférieur à $puissance

for ($i = 0; $i < $puissance; $i++)

{

$resultat *= $nombre; // équivaut à $resultat = $resultat * $nombre;

}

return ($resultat);

}

Pour l'utilisation, faites :

// Affichera 3 à la puissance 4, soit 81

echo my_pow(3, 4);

III - Programmation récursive

La programmation récursive 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 tous ses sous-répertoires, ainsi que tous 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 répète 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 prends 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 début 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 rencontré

my_print_r($value);

}

else

{

// On affiche la clé 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ées itérativement, refaites-la en récursif ;).