Résumé de trois façons d'implémenter la récursivité en PHP

伊谢尔伦
Libérer: 2023-03-12 09:58:01
original
1052 Les gens l'ont consulté

Cet article présente principalement les trois méthodes de base d'implémentation de la récursivité en PHP, notamment l'utilisation de références comme paramètres, l'utilisation de variables globales et l'utilisation de variables statiques pour implémenter la récursivité. Enfin, je vais vous donner une démonstration impliquant. PHP. Les amis qui en ont besoin peuvent se référer à

La fonction récursive est un type de fonction que nous utilisons couramment. La fonctionnalité la plus basique est que la fonction s'appelle elle-même, mais elle doit être appelée avant d'appeler. lui-même Il y a jugement conditionnel, sinon il sera appelé indéfiniment. Quelles méthodes peuvent être utilisées pour implémenter des fonctions récursives ? Cet article répertorie trois méthodes de base. Le comprendre nécessite un certain nombre de connaissances de base, notamment une compréhension des variables globales, des références, des variables statiques et une compréhension de leur portée. Les fonctions récursives sont également une bonne technique pour résoudre des niveaux infinis de classification. Si vous êtes intéressé par la classification infinie, veuillez vous référer à PHP pour utiliser des fonctions récursives afin d'obtenir une classification infinie. J'ai l'habitude d'expliquer des vérités complexes en termes simples. Si vous ne comprenez vraiment pas, veuillez vous référer au manuel.

Utiliser des références comme paramètres

Que les références soient des paramètres ou non, il faut d'abord comprendre ce qu'est une référence ? Une référence signifie simplement que deux variables portant des noms différents pointent vers la même adresse de stockage. À l'origine, chaque variable avait sa propre adresse de stockage, et l'affectation et la suppression se déroulaient selon leur propre chemin. Bon maintenant, les deux variables partagent une adresse de stockage. $a=&$b; Cela signifie en réalité que $a doit partager la même pièce avec $b quelle que soit son adresse de stockage d'origine. Par conséquent, toute modification de la valeur de l'adresse stockée affectera les deux valeurs. ​

Les fonctions font à l'origine leur propre travail, même s'il s'agit de fonctions portant le même nom. Les fonctions récursives envisagent de prendre des références comme paramètres et de devenir un pont pour former un partage de données entre deux fonctions. Bien que les deux fonctions semblent fonctionner sur des adresses différentes, elles opèrent en réalité sur la même adresse mémoire.

function test($a=0,&$result=array()){
$a++;
if ($a<10) {
  $result[]=$a;
  test($a,$result);
}
echo $a;
return $result;

}
Copier après la connexion

L'exemple ci-dessus est très simple. Utilisez a<10 comme condition de jugement, si la condition est vraie, attribuez a à result[]; Le a est ajouté au résultat du tableau de résultats. Par conséquent, le tableau $result généré dans cet exemple est Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5 ] => 6 [6] => 7 [7] =>

Ce qui est plus intéressant dans cet exemple, c'est la valeur de echo a. Je crois que beaucoup de gens pensent qu’il s’agit du 12345678910, mais en réalité ce n’est pas le cas, il s’agit du 1098765432. Pourquoi? Parce que la fonction a effectué la récursion de fonction suivante avant d'exécuter echoa. L'exécution réelle de echo a a lieu lorsque la condition a<10 n'est pas remplie, echo a renvoie le résultat. Pour la couche supérieure, après avoir exécuté la fonction récursive, il commence à exécuter echo $a de cette couche, et ainsi de suite.

Utilisation de variables globales

Utilisation de variables globales pour exécuter des fonctions récursives, assurez-vous de bien comprendre ce que sont les variables globales. La variable globale déclarée dans la fonction n'est qu'une référence à la variable externe du même nom. La portée de la variable est toujours dans la portée de cette fonction. Changer les valeurs de ces variables modifiera naturellement les valeurs des variables externes du même nom. Mais une fois & utilisé, la variable du même nom n'est plus une référence du même nom. Il n'est pas nécessaire de comprendre un niveau aussi profond pour utiliser des variables globales pour implémenter des fonctions récursives. Vous pouvez comprendre les fonctions récursives naturellement en conservant la vue originale des variables globales.

function test($a=0,$result=array()){
  global $result;
  $a++;
  if ($a<10) {
    $result[]=$a;
    test($a,$result);
  }
  return $result;
}
Copier après la connexion

Utiliser des variables statiques

On voit souvent du static dans les classes, et aujourd'hui on l'utilise dans des fonctions récursives. N'oubliez pas le rôle du statique : initialisez la variable uniquement la première fois que la fonction est appelée et conservez la valeur de la variable.

Par exemple :

function test(){
static $count=0;
echo $count;

$count++;
}
test();
test();
test();
test();
test();
Copier après la connexion

Quel est le résultat de l'exécution de ce code ? Est-ce 00000 ? Certainement pas. Nous sommes 01234. Premièrement, lors du premier appel de test(), static initialise $count. Après chaque exécution ultérieure, la valeur de $count sera conservée et ne sera plus initialisée. Cela équivaut à ignorer directement la phrase static $count=0;.

Par conséquent, l'effet de l'application de statique à une fonction récursive peut être imaginé. Les variables qui doivent être utilisées comme « ponts » entre les fonctions récursives sont initialisées en utilisant statique, et la valeur des « variables de pont » sera conservée pour chaque récursion.

function test($a=0){
  static $result=array();
  $a++;
  if ($a<10) {
    $result[]=$a;
    test($a);
  }
  return $result;
}
Copier après la connexion

Résumé

La fonction dite récursive se concentre sur la façon de gérer l'appel de fonction lui-même et sur la façon de garantir que les résultats requis peuvent être raisonnablement "transmis " entre fonctions. Bien sûr, il existe aussi des fonctions récursives qui ne nécessitent pas de transfert de valeur entre fonctions, par exemple :

function test($a=0){
  $a++;
  if ($a<10) {
    echo $a;

    test($a);
  }
}
Copier après la connexion

Face à une telle fonction, on n'a pas à s'en soucier. Soit dit en passant, une compréhension approfondie des références de variables peut grandement contribuer à résoudre ce type de problème.

Enfin, j'aimerais partager avec vous une méthode d'implémentation de la récursivité et de la classification infinie en PHP. La méthode d'implémentation spécifique est la suivante :

<?php
echo "<pre class="brush:php;toolbar:false">";
$area = array(
array(&#39;id&#39;=>1,&#39;area&#39;=>&#39;北京&#39;,&#39;pid&#39;=>0),
array(&#39;id&#39;=>2,&#39;area&#39;=>&#39;广西&#39;,&#39;pid&#39;=>0),
array(&#39;id&#39;=>3,&#39;area&#39;=>&#39;广东&#39;,&#39;pid&#39;=>0),
array(&#39;id&#39;=>4,&#39;area&#39;=>&#39;福建&#39;,&#39;pid&#39;=>0),
array(&#39;id&#39;=>11,&#39;area&#39;=>&#39;朝阳区&#39;,&#39;pid&#39;=>1),
array(&#39;id&#39;=>12,&#39;area&#39;=>&#39;海淀区&#39;,&#39;pid&#39;=>1),
array(&#39;id&#39;=>21,&#39;area&#39;=>&#39;南宁市&#39;,&#39;pid&#39;=>2),
array(&#39;id&#39;=>45,&#39;area&#39;=>&#39;福州市&#39;,&#39;pid&#39;=>4),
array(&#39;id&#39;=>113,&#39;area&#39;=>&#39;亚运村&#39;,&#39;pid&#39;=>11),
array(&#39;id&#39;=>115,&#39;area&#39;=>&#39;奥运村&#39;,&#39;pid&#39;=>11),
array(&#39;id&#39;=>234,&#39;area&#39;=>&#39;武鸣县&#39;,&#39;pid&#39;=>21)
);
function t($arr,$pid=0,$lev=0){
static $list = array();
foreach($arr as $v){
if($v[&#39;pid&#39;]==$pid){
echo str_repeat(" ",$lev).$v[&#39;area&#39;]."<br />";
//这里输出,是为了看效果
$list[] = $v;
t($arr,$v[&#39;id&#39;],$lev+1);
}
}
return $list;
}
$list = t($area);
echo "<hr >";
print_r($list);
?>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal