72 votes

Qu'est-ce qu'une fonction récurrente en PHP?

Est-ce que quelqu'un peut m'expliquer une fonction récursive en PHP (sans utiliser Fibonacci) en langage profane et en utilisant des exemples? Je cherchais un exemple, mais le Fibonacci m'a totalement perdu!

Merci d'avance ;-) En outre, à quelle fréquence les utilisez-vous dans le développement Web?

89voto

Anthony Forloney Points 30083

Laymens termes:

Une fonction récursive est une fonction qui s'appelle elle-même

Un peu plus en profondeur:

Si la fonction continue d'appeler lui-même, comment fait-il savoir quand s'arrêter? Vous définissez une condition connue comme une base de cas. De la Base de cas dire à notre appel récursif quand s'arrêter, sinon il sera en boucle à l'infini.

Ce qui était un bon exemple d'apprentissage pour moi, puisque j'ai une solide formation en mathématiques, a été factorielle. Par les commentaires ci-dessous, il semble que la fonction factorielle peut être un peu trop, je vais le laisser ici, juste au cas où vous vouliez.

function fact($n) {
  if ($n === 0) { // our base case
     return 1;
  }
  else {
     return $n * fact($n-1); // <--calling itself.
  }
}

En ce qui concerne l'utilisation des fonctions récursives en développement web, je ne suis pas personnellement recourir à l'aide d'appels récursifs. Non pas que je le considère comme une mauvaise pratique de s'appuyer sur la récursivité, mais ils ne devraient pas être votre première option. Ils ont peut être mortel s'il n'est pas utilisé correctement.

Bien que je ne peut pas rivaliser avec le répertoire exemple, j'espère que cela aide un peu.

(4/20/10) mise à Jour:

Il serait également utile de vérifier sur cette question, où l'on a accepté la réponse démontre en termes profanes comment une fonction récursive œuvres. Même si l'OP est question traitait de Java, le concept est le même,

32voto

Progman Points 2244

Un exemple serait d'imprimer tous les fichiers dans tous les sous-répertoires d'un répertoire donné (si vous n'avez pas de liens symboliques à l'intérieur de ces répertoires qui peuvent casser la fonction en quelque sorte). Un pseudo-code de l'impression de tous les fichiers ressemble à ceci:

function printAllFiles($dir) {
    foreach (getAllDirectories($dir) as $f) {
        printAllFiles($f); // here is the recursive call
    }
    foreach (getAllFiles($dir) as $f) {
        echo $f;
    }
}

L'idée est d'imprimer tous les sous répertoires en premier et ensuite les fichiers du répertoire courant. Cette idée appliquée à tous les sous-répertoires, et c'est la raison de l'appel de cette fonction de manière récursive pour tous les sous répertoires.

Si vous voulez essayer cet exemple, vous avez pour vérifier les répertoires spéciaux . et .., sinon vous êtes coincé en appelant printAllFiles(".") tout le temps. En outre, vous devez vérifier les éléments à imprimer et à ce que votre répertoire de travail courant (voir opendir(), getcwd(), ...).

23voto

Freyr Points 173

La récursivité est quelque chose qui se répète. Comme une fonction qui s'appelle elle-même de l'intérieur de lui-même. Permettez-moi de démontrer en quelque sorte dans une pseudo exemple:

Imaginez que vous êtes avec vos amis, boire de la bière, mais votre femme va vous donner de l'enfer si vous ne venez pas à la maison avant minuit. Pour cela, nous allons créer le orderAndDrinkBeer($time) de la fonction où $temps est minuit moins le temps qu'il vous faut pour finir votre verre et rentrer à la maison.

Donc, en arrivant au bar, vous commandez votre première bière et de commencer à boire:

$timeToGoHome = '23';  // Let's give ourselves an hour for last call and getting home

function orderAndDrinkBeer($timeToGoHome) {  // Let's create the function that's going to call itself.
    $beer = New Beer();  // Let's grab ourselves a new beer
    $currentTime = date('G'); // Current hour in 24-hour format

    while ($beer->status != 'empty') {  // Time to commence the drinking loop
        $beer->drink();  // Take a sip or two of the beer(or chug if that's your preference)
    }

    // Now we're out of the drinking loop and ready for a new beer

    if ($currentTime < $timeToGoHome) { // BUT only if we got the time
        orderAndDrinkBeer($timeToGoHome);  // So we make the function call itself again!
    } else {  // Aw, snap!  It is time :S
        break; // Let's go home :(
    }
}

Maintenant, espérons juste que vous n'étiez pas en mesure de boire de la bière assez pour devenir si ivre que votre femme va vous faire dormir sur le canapé, indépendamment d'être à la maison à temps -.-

Mais ouais, c'est assez bien comment la récursivité va.

9voto

James Westgate Points 6789

Ses une fonction qui s'appelle elle-même. Il est utile pour la marche de certaines structures de données qui se répètent, comme des arbres. Un DOM HTML est un exemple classique.

Un exemple de structure de l'arbre en javascript et une fonction récursive pour "marcher" l'arbre.

    1
   / \
  2   3
     / \
    4   5

--

var tree = {
  id: 1,
  left: {
    id: 2,
    left: null,
    right: null
  },
  right: {
    id: 3,
    left: {
      id: 4,
      left: null,
      right: null
    },
    right: {
      id: 5,
      left: null,
      right: null
    }
  }
};

Au pied de l'arbre, nous appelons la même fonction à plusieurs reprises, en passant les nœuds enfants du nœud courant à la même fonction. Puis on appelle la fonction de nouveau, d'abord sur le nœud de gauche, puis sur la droite.

Dans cet exemple, nous allons obtenir la profondeur maximale de l'arbre

var depth = 0;

function walkTree(node, i) {

  //Increment our depth counter and check
  i++;
  if (i > depth) depth = i;

  //call this function again for each of the branch nodes (recursion!)
  if (node.left != null) walkTree(node.left, i);
  if (node.right != null) walkTree(node.right, i);

  //Decrement our depth counter before going back up the call stack
  i--;
}

Enfin, nous appelons la fonction

alert('Tree depth:' + walkTree(tree, 0));

Un excellent moyen de comprendre la récursivité est à l'étape dans le code lors de l'exécution.

8voto

Samuel Points 865

En termes simples: une fonction récursive est une fonction qui s’appelle elle-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X