国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Table des matières
Quel est l'exemple de base de la fonction récursive PHP?
Comment fonctionnent les fonctions récursives en PHP?
Tous les problèmes de PHP peuvent-ils être résolus à l'aide de la récursivité?
Comment empêcher le débordement de pile dans les fonctions récursives PHP?
Qu'est-ce que la récursivité de la queue en PHP?
Comment comparer la récursivité avec la boucle en php?
Puis-je utiliser la récursivité pour itérer les tableaux en php?
Qu'est-ce que la récursivité mutuelle en PHP?
Comment déboguer les fonctions récursives dans PHP?
Quelles sont les limites de l'utilisation de la récursivité en PHP?
Maison développement back-end tutoriel php PHP Master | Comprendre la récursivité

PHP Master | Comprendre la récursivité

Feb 24, 2025 am 10:10 AM

PHP Master | Understanding Recursion

Points de base

  • Recursion est une méthode de résolution de problèmes qui implique la fonction qui s'appelle directement ou indirectement (via une boucle d'appel de fonction). Il est particulièrement utile lorsqu'il s'agit d'itérer à travers les arbres et les listes ou la plupart des types O (n log n).
  • Les fonctions récursives doivent avoir un bo?tier de base ou une clause de protection pour les empêcher de se dire infiniment, ce qui entra?ne une erreur de débordement de pile. Cet exemple de base est une condition qui empêche la fonction de passer d'autres appels récursifs lorsqu'une condition spécifique est remplie.
  • Il existe deux types de récursivité: la récursivité directe et la récursivité indirecte. La récursivité directe signifie que la fonction s'appelle directement, tandis que la récursivité indirecte signifie que la fonction s'appelle indirectement via une autre fonction. Cet article se concentre sur la récursivité directe.
  • Bien que la récursivité puisse être un outil puissant, il doit être utilisé avec prudence. PHP n'optimise pas les fonctions récursives, et elles ne sont généralement pas aussi efficaces et rapides que leurs homologues itératives. Cependant, la récursivité peut être plus efficace dans certains cas, comme la recherche ou la traversée de profondeurs incertaines dans un système de fichiers.

Dans un post précédent, j'ai écrit sur les itérateurs et comment les utiliser. Aujourd'hui, je veux voir les frères et s?urs itératifs: la récursivité. Cependant, avant de discuter de la récursivité, jetons un coup d'?il à ce code:

<?php
function factorial($number) {
    if ($number < 0) {
        throw new InvalidArgumentException('Number cannot be less than zero');
    }
    $factorial = 1; 
    while ($number > 0) {
        $factorial *= $number;
        $number--;
    }
    return $factorial;
}
Les usines

sont le résultat d'un nombre multiplié par tous les entiers positifs plus petits que ce nombre. Maintenant, réécrivons cet exemple comme ceci:

<?php
function factorial_recursive($number) {
    if ($number < 0) {
        throw new InvalidArgumentException('Number cannot be less than zero');
    }
    if ($number == 0) {
        return 1;
    }
    return $number * factorial_recursive($number - 1);
}

Lorsque nous appelons ces deux fonctions, nous obtenons le même résultat, mais notez que la deuxième fonction calcule factoriel en s'appelant. C'est ce qu'on appelle la récursivité.

Qu'est-ce que la récursivité?

Les fonctions récursives se réfèrent aux fonctions qui s'appellent directement ou via des boucles d'appels de fonction. La récursivité peut également se référer à une méthode de résolution de problèmes qui résout d'abord une version plus petite du problème, puis utilise ce résultat pour ajouter d'autres calculs pour former une réponse à la question d'origine. En règle générale, dans le processus de résolution de versions plus petites, cette approche résoudra les versions plus petites du puzzle, etc., jusqu'à ce qu'un "exemple de base" facile à résoudre soit atteint. Pour écrire une fonction récursive, vous devez lui fournir une méthode de retour, sinon il continuera de s'appeler pour toujours (ou jusqu'à ce que la pile d'appels éclate, le script expiré ou la mémoire s'épuise). C'est ce qu'on appelle une clause de protection ou un bo?tier de base. La forme la plus simple d'une fonction récursive est la suivante:

<?php
function my_recursive_func(args) {
    if (simplest case) {
        // 停止函數(shù)無限運行的基例/保護子句
        return simple value;
    }
    else {
        // 使用更簡單的參數(shù)再次調(diào)用函數(shù)
        my_recursive_func(argsSimplified);
    }
}

Type récursif

Lorsqu'une fonction s'appelle directement, elle est appelée recursion directe. L'appel final d'une fonction dans une boucle d'appel de fonction est appelé récursivité indirecte. Veuillez consulter l'exemple suivant de récursivité indirecte:

<?php
function A($num) {
    $num -= 1;
    if($num > 0) {  
        echo "A is Calling B($num)\n";
        $num = B($num);
    }
    return $num;
}

function B($num) {
    $num -= 2;
    if($num > 0) {
        echo "B is Calling A($num)\n";
        $num = A($num);
    }
    return $num;
}

$num = 4;
echo "Calling A($num)\n";
echo 'Result: ' . A($num);
<code>Calling A(4)
A is Calling B(3)
B is Calling A(1)
Result: 0</code>

L'exemple ci-dessus est en fait du code inutile, juste pour vous montrer comment une fonction s'appelle indirectement via une autre fonction. L'appel a (n & gt; 4) ou b (n & gt; 4) provoque une fonction appelée à partir d'un autre appel de fonction. Il est important de savoir que les fonctions peuvent s'appeler indirectement comme ceci, mais dans cet article, nous ne traitons que la récursivité directe.

Un exemple pratique

Pour vous montrer la puissance de la récursivité, nous rédigerons une fonction qui recherche des clés dans un tableau et renvoie les résultats.

<?php
function factorial($number) {
    if ($number < 0) {
        throw new InvalidArgumentException('Number cannot be less than zero');
    }
    $factorial = 1; 
    while ($number > 0) {
        $factorial *= $number;
        $number--;
    }
    return $factorial;
}
<?php
function factorial_recursive($number) {
    if ($number < 0) {
        throw new InvalidArgumentException('Number cannot be less than zero');
    }
    if ($number == 0) {
        return 1;
    }
    return $number * factorial_recursive($number - 1);
}

Tout s'est bien passé, mais notez que nous n'avons itéré que la deuxième couche du tableau, donc la recherche de "Fibonacci" dans la troisième couche a échoué. Si nous devions rechercher des tableaux de profondeur incertaine, cela ne serait pas suffisant. Nous pouvons réécrire la recherche comme une fonction récursive:

<?php
function my_recursive_func(args) {
    if (simplest case) {
        // 停止函數(shù)無限運行的基例/保護子句
        return simple value;
    }
    else {
        // 使用更簡單的參數(shù)再次調(diào)用函數(shù)
        my_recursive_func(argsSimplified);
    }
}

En utilisant des fonctions récursives, nous pouvons rechercher plusieurs couches de tableaux profonds car nous n'avons pas la profondeur des fonctions codées en dur. Il continue de fonctionner jusqu'à itérer toutes les valeurs du tableau.

Recursion de la tête et récursivité de la queue

Dans tous nos exemples jusqu'à présent, nous avons utilisé la récursivité dite de la tête. Lorsqu'une fonction s'appelle, il attend le résultat de l'appel avant de retourner sa propre valeur. Vous pouvez écrire une fonction qui ne fonctionne pas sur la valeur de retour, mais transmet toutes les valeurs requises comme paramètres. C'est ce qu'on appelle l'appel à queue (ou la récursivité de la queue). Cette méthode est généralement préférée car l'exécution du langage peut parfois optimiser les appels, il n'y a donc pas de danger de dynamiser la pile d'appels, mais PHP ne le fait pas. Ce qui suit est notre exemple factoriel, modifié pour passer un appel de queue. Notez que le résultat de l'appel récursif est retourné, plut?t que de le manipuler davantage.

<?php
function A($num) {
    $num -= 1;
    if($num > 0) {  
        echo "A is Calling B($num)\n";
        $num = B($num);
    }
    return $num;
}

function B($num) {
    $num -= 2;
    if($num > 0) {
        echo "B is Calling A($num)\n";
        $num = A($num);
    }
    return $num;
}

$num = 4;
echo "Calling A($num)\n";
echo 'Result: ' . A($num);

Suggestions générales

Tout code qui peut être écrit en itérative peut être écrit en récursivement. Cependant, ce n'est pas toujours facile à faire (même sage). La récursivité est excellente lorsqu'il s'agit d'itérer à travers les arbres et les listes ou la plupart des types O (n log n). La récursivité est plus appropriée que les méthodes itératives lorsque vous devez diviser les problèmes répétitifs, tels que la recherche dans un système de fichiers, et vous devez également vous rendre dans n'importe quel sous-répertoire pour rechercher. La récursivité fonctionne bien lors de la traversée des profondeurs incertaines. N'oubliez pas que PHP n'optimise pas les fonctions récursives, et même si vous les écrivez pour les appels de queue, les fonctions récursives sont généralement inefficaces et plus lentes que leurs homologues itératives, bien qu'ils fassent parfois le travail mieux, comme dans l'exemple de code ci-dessus. La récursivité est généralement l'alternative préférée à l'itération dans la programmation fonctionnelle, de sorte que la plupart des langages fonctionnels optimisent les fonctions récursives. Si vous utilisez xdebug, assurez-vous de vérifier la configuration de votre système. Par défaut, vous limiterez 100 appels récursifs, et si vous dépassez cette limite, votre script lancera une erreur de nidification maximale a été atteinte ". Si vous devez modifier ce paramètre, vous pouvez mettre à jour la valeur de configuration debug.max_nesting_level. Enfin, il est préférable de lire l'explication du tas de pile et de la récursivité provoquant un débordement de pile pour comprendre ce qui arrive pour appeler la pile pendant la récursivité.

Conclusion

Dans cet article, je vous présente beaucoup à la récursivité et à sa comparaison avec l'itération. Je vous ai également montré comment écrire des fonctions récursives, quand les écrire et pourquoi. J'essaie également de vous avertir de certains pièges que vous pourriez rencontrer lors de l'utilisation de la récursivité. La récursivité est comme ?a, même de nombreux programmeurs expérimentés peuvent ne pas l'utiliser depuis des années, et beaucoup d'autres n'en ont même jamais entendu parler, ce qui est dommage car c'est un concept vraiment puissant. J'espère que grace à ce post, je pourrai vous donner suffisamment de connaissances pour commencer à écrire vos propres fonctions récursives. Mais n'oubliez pas que, tout comme l'utilisation du feu, vous devez toujours utiliser cet outil avec prudence.

Image d'Alexandre Duret-Lutz par Flickr

FAQS sur la compréhension de la récursivité dans PHP (FAQ)

Quel est l'exemple de base de la fonction récursive PHP?

L'exemple de base dans les fonctions récursives PHP est une condition qui empêche la fonction de s'appeler infiniment. C'est un élément clé de toute fonction récursive. Sans cas de base, la fonction récursive s'appellera infiniment, ce qui entra?ne une erreur de débordement de pile. En PHP, les exemples de base sont généralement définis à l'aide de l'instruction "IF" au début d'une fonction. La fonction vérifie cette condition avant de procéder à l'appel récursif. Si la condition est remplie, la fonction renvoie une valeur et cesse de s'appeler.

Comment fonctionnent les fonctions récursives en PHP?

La fonction récursive de PHP s'appelle dans son propre corps de fonction jusqu'à ce qu'une condition spécifique appelée le cas de base soit satisfaite. Lorsqu'une fonction récursive est appelée, elle effectue une tache spécifique, puis s'appelle pour répéter la tache. Ce processus se poursuit jusqu'à ce que le cas de base soit satisfait et que la fonction cesse de s'appeler. Chaque fois qu'une fonction est appelée, une nouvelle couche est créée sur la pile d'appels, stockant les variables et les adresses de retour des appels de fonction. Une fois le bo?tier de base rempli, la fonction commence à retourner et détruise la couche de pile d'appel par calque.

Tous les problèmes de PHP peuvent-ils être résolus à l'aide de la récursivité?

Bien que la récursivité puisse être un outil puissant en PHP, tous les problèmes ne peuvent pas ou doivent être résolus à l'aide de la récursivité. La récursivité est mieux adaptée aux problèmes qui peuvent être décomposés en problèmes plus petits et plus similaires, tels que la traversée des répertoires de fichiers ou les tableaux de tri. Cependant, si elle est mal utilisée, la récursivité peut entra?ner une utilisation élevée de la mémoire et des erreurs de débordement de pile. Il est également généralement plus lent que les solutions itératives en raison des frais généraux des appels de fonction. Par conséquent, il est très important de comprendre le problème à portée de main et de choisir la bonne approche.

Comment empêcher le débordement de pile dans les fonctions récursives PHP?

Le débordement de pile dans les fonctions récursifs peut être évité en définissant soigneusement les instances de base que la fonction finira par atteindre. Le bo?tier de base est une condition, et lorsque cette condition est remplie, la fonction cesse de passer d'autres appels récursifs. Sans cas de base, la fonction s'appellera infiniment, provoquant un débordement de pile. Il est également important de s'assurer que chaque appel récursif rapproche la fonction du cas de base pour éviter une récursivité infinie.

Qu'est-ce que la récursivité de la queue en PHP?

La récursivité de la queue est un type spécial de récursivité, où l'appel récursif est la dernière opération de la fonction. Cela signifie pas besoin de garder une trace des appels de fonction précédents, permettant au compilateur ou à l'interprète d'optimiser la récursivité et de réduire le risque de débordement de pile. Cependant, PHP lui-même ne prend pas en charge l'optimisation récursive de la queue. Ainsi, même si vous pouvez écrire des fonctions récursives de queue dans PHP, elles ne sont pas optimisées et consomment toujours de l'espace de pile pour chaque appel récursif.

Comment comparer la récursivité avec la boucle en php?

La récursivité et la boucle peuvent être utilisées pour répéter un ensemble d'instructions en PHP. Cependant, ils fonctionnent différemment et présentent des avantages et des inconvénients différents. La récursivité est un outil puissant pour résoudre des problèmes complexes qui peuvent être décomposés en problèmes plus petits et plus similaires. Il est particulièrement utile pour traverser des taches comme les arbres ou les graphiques. Les boucles, en revanche, sont souvent plus adaptées aux taches répétitives simples. Ils utilisent moins de mémoire que la récursivité et sont peu susceptibles de provoquer un débordement de pile.

Puis-je utiliser la récursivité pour itérer les tableaux en php?

Oui, la récursivité peut être un moyen très efficace de traverser les tableaux (en particulier les tableaux multidimensionnels) en PHP. Vous pouvez utiliser une fonction récursive pour itérer sur chaque élément dans un tableau, et si l'élément lui-même est un tableau, la fonction peut s'appeler pour itérer sur le tableau. Ce processus se poursuit jusqu'à ce que tous les éléments soient accessibles. Cependant, n'oubliez pas que la récursivité peut être plus lente que les solutions itératives et utilisera plus de mémoire, en particulier dans le cas de grands tableaux.

Qu'est-ce que la récursivité mutuelle en PHP?

La récursivité mutuelle fait référence à deux fonctions ou plus qui sont appelées les unes avec les autres dans une boucle. Dans PHP, cela signifie que la fonction a appelle la fonction B, et la fonction B appelle la fonction A. Cela peut être un outil puissant pour résoudre certains types de problèmes, mais il peut également être plus difficile à comprendre et à déboguer qu'une simple récursivité. Comme pour toute fonction récursive, il est important de définir un cas de base pour empêcher la récursivité infinie.

Comment déboguer les fonctions récursives dans PHP?

Les fonctions récursives de débogage dans PHP peuvent être difficiles car la fonction s'appelle plusieurs fois. Cependant, vous pouvez utiliser plusieurs stratégies. Une fa?on consiste à utiliser une déclaration d'impression ou un débogueur pour suivre l'appel de fonction et afficher l'état des variables à chaque étape. Une autre fa?on consiste à dessiner un arbre récursif pour visualiser les appels de fonction. Il est également important de revérifier le bo?tier de base et le bo?tier de récursivité pour s'assurer qu'ils sont corrects.

Quelles sont les limites de l'utilisation de la récursivité en PHP?

Bien que la récursivité puisse être un outil puissant en PHP, il a certaines limites. L'une des principales limites est que si la récursivité est trop profonde, il y a un risque de débordement de pile. En effet, chaque appel récursif ajoute une nouvelle couche à la pile d'appels et la taille de la pile est limitée. En raison des frais généraux des appels de fonction, la récursivité peut également être plus lente que les solutions itératives et utilisera plus de mémoire. De plus, les fonctions récursives peuvent être plus difficiles à comprendre et à déboguer que les solutions itératives.

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!

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

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment mettre en ?uvre l'authentification et l'autorisation dans PHP? Comment mettre en ?uvre l'authentification et l'autorisation dans PHP? Jun 20, 2025 am 01:03 AM

ToseCurelyHandleAuthentication andAuthorizationInPhp, suivitheSesteps: 1.AlwayShashPasswordSwithPassword_Hash () etverifyusingPassword_verify (), usePreparedStatementStopReventsQLendiject, andstoreSerDatain $ _SessionAfterLogin.2

Comment pouvez-vous gérer les téléchargements de fichiers en toute sécurité dans PHP? Comment pouvez-vous gérer les téléchargements de fichiers en toute sécurité dans PHP? Jun 19, 2025 am 01:05 AM

Pour gérer en toute sécurité les téléchargements de fichiers dans PHP, le noyau consiste à vérifier les types de fichiers, à renommer les fichiers et à restreindre les autorisations. 1. Utilisez finfo_file () pour vérifier le type de mime réel, et seuls des types spécifiques tels que l'image / jpeg sont autorisés; 2. Utilisez Uniqid () pour générer des noms de fichiers aléatoires et les stocker dans le répertoire racine non Web; 3. Limiter la taille du fichier via les formulaires PHP.ini et HTML et définir les autorisations de répertoire sur 0755; 4. Utilisez Clamav pour scanner les logiciels malveillants pour améliorer la sécurité. Ces étapes empêchent efficacement les vulnérabilités de sécurité et garantissent que le processus de téléchargement de fichiers est s?r et fiable.

Quelles sont les différences entre == (comparaison lache) et === (comparaison stricte) en PHP? Quelles sont les différences entre == (comparaison lache) et === (comparaison stricte) en PHP? Jun 19, 2025 am 01:07 AM

En PHP, la principale différence entre == et == est la rigueur de la vérification des types. == La conversion de type sera effectuée avant la comparaison, par exemple, 5 == "5" Renvoie True, et === Demande que la valeur et le type soient les mêmes avant que True sera renvoyé, par exemple, 5 === "5" Renvoie False. Dans les scénarios d'utilisation, === est plus sécurisé et doit être utilisé en premier, et == n'est utilisé que lorsque la conversion de type est requise.

Comment pouvez-vous interagir avec les bases de données NoSQL (par exemple, MongoDB, redis) de PHP? Comment pouvez-vous interagir avec les bases de données NoSQL (par exemple, MongoDB, redis) de PHP? Jun 19, 2025 am 01:07 AM

Oui, PHP peut interagir avec les bases de données NoSQL comme MongoDB et Redis à travers des extensions ou des bibliothèques spécifiques. Tout d'abord, utilisez le pilote MongoDBPHP (installé via PECL ou Composer) pour créer des instances clients et faire fonctionner des bases de données et des collections, en prenant en charge l'insertion, la requête, l'agrégation et d'autres opérations; Deuxièmement, utilisez la bibliothèque Predis ou l'extension PHPREDIS pour vous connecter à Redis, effectuer des paramètres et des acquisitions de valeur clé, et recommander PHPredis pour des scénarios à haute performance, tandis que Predis est pratique pour un déploiement rapide; Les deux conviennent aux environnements de production et sont bien documentés.

Comment effectuer des opérations arithmétiques en php (, -, *, /,%)? Comment effectuer des opérations arithmétiques en php (, -, *, /,%)? Jun 19, 2025 pm 05:13 PM

Les méthodes d'utilisation des opérations mathématiques de base en PHP sont les suivantes: 1. Les signes d'addition prennent en charge les entiers et les nombres à virgule flottante, et peuvent également être utilisés pour les variables. Les numéros de cha?ne seront automatiquement convertis mais non recommandés en dépendances; 2. Les signes de soustraction utilisent - les signes, les variables sont les mêmes et la conversion de type est également applicable; 3. Les panneaux de multiplication utilisent * les panneaux, qui conviennent aux nombres et aux cha?nes similaires; 4. La division utilise / signes, qui doit éviter de diviser par zéro, et noter que le résultat peut être des nombres à virgule flottante; 5. Prendre les signes du module peut être utilisé pour juger des nombres impairs et uniformes, et lors du traitement des nombres négatifs, les signes restants sont cohérents avec le dividende. La clé pour utiliser correctement ces opérateurs est de s'assurer que les types de données sont clairs et que la situation limite est bien gérée.

Comment rester à jour avec les derniers développements PHP et meilleures pratiques? Comment rester à jour avec les derniers développements PHP et meilleures pratiques? Jun 23, 2025 am 12:56 AM

TostayCurrentwithPhpDevelopments andBestPractices, suiventyewnewsources likephp.netandphpweekly, engagewithcommunitiesonforumums et conférences, keeptoolingupdated etgradualadoptnewfeatures, etreadorontruttetoopensourceprojects.

Qu'est-ce que PHP et pourquoi est-il utilisé pour le développement Web? Qu'est-ce que PHP et pourquoi est-il utilisé pour le développement Web? Jun 23, 2025 am 12:55 AM

PhpBecamepopularforwebDevelopmentDuetoitSeaseOflearning, Samoussentegration withhtml, widespreadhostingsupport, andalargecosystemysteclustingframeworkslikeLaravelandcmsplateformeslikewordpress.itexcelSinlingFormSubMissions, ManagetingSeSeSessions, interactif, interactif

Comment définir le fuseau horaire PHP? Comment définir le fuseau horaire PHP? Jun 25, 2025 am 01:00 AM

Tosetherighttimezoneinphp, usedate_default_timezone_set () Fonctionnellestartofyourscriptwithavalididentifiersuchas'america / new_york'.1.usedate_default_timezone_set () beforeanydate / timefunctions.20

See all articles