IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

récursivité et itérativité


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Chine

    Informations forums :
    Inscription : Janvier 2013
    Messages : 48
    Par défaut récursivité et itérativité
    Bonjour,
    Je veux simplement qu'elle est la méthode souffrent de coût de calcul élevé
    est ce que les méthodes itératives ou celle récursives

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Ca ne veut rien dire.
    Il n'y a pas de question dans ce que tu dis.

    Par contre, en général, la récursion est plus coûteuse. En temps à cause des appels de fonctions successifs.
    Par contre, l'itération aura souvent besoin de plus de mémoire.

    La récursion est plus lente à cause des multiples appels de fonction.
    L'itération est plus rapide, mais peut requérir plus de mémoire allouée en même temps.



    Il s'agit souvent d'un compromis, et souvent, les gens se tournent vers l'itération.

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Chine

    Informations forums :
    Inscription : Janvier 2013
    Messages : 48
    Par défaut
    Par contre, en général, la récursion est plus coûteuse. En temps à cause des appels de fonctions successifs.
    En effet ,vous avez répondus à ma question

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Citation Envoyé par leternel Voir le message
    L'itération est plus rapide, mais peut requérir plus de mémoire allouée en même temps.
    Il faut différencier deux choses : l'algorithme et l'implémentation.

    Niveau algorithme, entre l'itératif et le récursif, je ne vois pas vraiment de raison pour que l'itératif prenne plus de mémoire que le récursif.
    Par contre je ne suis pas sûr qu'on puisse toujours convertir un algorithme récursif en un algorithme itératif.

    Au niveau de l'implémentation, on peut implémenter n'importe quel algorithme récursif en itératif en recréant une pile. Dans ce cas là l'implémentation itérative coûtera toujours moins de mémoire que la récursive.
    Après selon l'implémentation on utilisera plus ou moins de mémoire.

    Mais je pense que la vitesse ou la mémoire utilisées restent vraiment des critères secondaires.

    Je pense que la principale chose à regarder est avant tout la lisibilité du code.
    Après il me semble avoir lu que la récursivité pouvait être dangereuse si on l'utilise pour gérée les E/S :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int foo(void)
    {
           int i;
           std::cin >> i;
           if( i > 10)
                 return foo();
           return i;
    }
    Car l'utilisateur pourrait s'amuser à ne donner que des réponses fausses et exploser la pile, après je ne connais pas les détails mais il serait possible à partir de là d'exploiter cette faille (?).

  5. #5
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Mais je pense que la vitesse ou la mémoire utilisées restent vraiment des critères secondaires.

    Je pense que la principale chose à regarder est avant tout la lisibilité du code.
    Après il me semble avoir lu que la récursivité pouvait être dangereuse si on l'utilise pour gérée les E/S :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int foo(void)
    {
           int i;
           std::cin >> i;
           if( i > 10)
                 return foo();
           return i;
    }
    Car l'utilisateur pourrait s'amuser à ne donner que des réponses fausses et exploser la pile, après je ne connais pas les détails mais il serait possible à partir de là d'exploiter cette faille (?).
    Tout dépend du contexte, si on travaille sur du temps réel, la vitesse compte bien plus que la lisibilité du code.

    Sinon pour l'exploit, je pense pas que ce soit possible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void foo() {
    	int i=42;
    	for(int j=0; j<42; ++j) {
    		i += j;
    	}
    } // juste avoir du code à remplacer
     
    int main() {
     
    	auto pfoo = &foo;
    	*((unsigned char*)pfoo) = 0xc3; // ret
     
    	return 0;
    }
    Violation d'accès, par défaut on à pas les droits d'écriture sur les segments de code, dans le pire des cas on peut peut être pourrir d'autres variables, mais rien de méchant je pense.

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    Tout dépend du contexte, si on travaille sur du temps réel, la vitesse compte bien plus que la lisibilité du code.
    Il est vrai que lorsqu'on code dans l'espace noyau ou en temps réel la lisibilité est souvent laissée en second plan, mais ce sont des cas assez spécifiques.

    Citation Envoyé par Iradrille Voir le message
    Sinon pour l'exploit, je pense pas que ce soit possible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void foo() {
    	int i=42;
    	for(int j=0; j<42; ++j) {
    		i += j;
    	}
    } // juste avoir du code à remplacer
     
    int main() {
     
    	auto pfoo = &foo;
    	*((unsigned char*)pfoo) = 0xc3; // ret
     
    	return 0;
    }
    Violation d'accès, par défaut on à pas les droits d'écriture sur les segments de code, dans le pire des cas on peut peut être pourrir d'autres variables, mais rien de méchant je pense.
    Heureusement qu'on a pas les droits d'écritures sur les segments de code mais pourrir des variables est loin d'être "rien de méchant" au contraire surtout dans le cas de serveurs

    Je pense que cette faille était surtout utilisée quand on avait dans la mémoire la pile "en bas" et le tas "en haut"
    La pile "montait" au fur et à mesure qu'elle grandissait et le tas "descendait".
    Il arrivait donc que la pile "rencontre" le tas. On pouvait alors réécrire dans le tas avec la pile parfois sans générer d'erreurs.

  7. #7
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Iteratif / recursif c'est une notion d'algorithme, pas d'implementation. Et de mémoire, il doit y avoir une preuve de l'existance d'un algo recursif quand on a un iteratif et vice et verse (recursif terminal en plus je crois). Le problème étant de trouver les équivalents (ca marche aussi dans l'autre sens). L'equivalence est en temps. En mémoire, je doute de la preuve pour l'equivalence d'un recursif terminal.

    Après il faut bien être conscient que les structures de données employé (ie de manière formelle) incite à penser d'un façon ou d'un autre.

    Quand à la différence de performance, j'attend toujours de voir un benchmark pertinant sur le sujet (iteratif,recursif et recursif terminal, avec et sans effet de bord, en optimisé). En attendant, j'ai tendance à penser que si j'ai un algo recursif terminal sans effet de bord, le compilateur est bien assez intelligent pour optimiser et obtenir les mêmes performances en temps qu'en iteratif.

    Pour ce qui est de la mémoire, la question ne se pose même pas, écrire (de manière formelle) les deux algos donne instantanément la réponse sur la différence pour la mémoire. La question se pose uniquement pour le temps car la compilation naïve d'un algo recursif passe par une pile coûteuse, sauf que les compilateur optimise de manière intelligente.

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    ^^Enfin, sur un système genre PC, le débordement de pile cause plus souvent une Denial of Service qu'une vraie corruption, parce qu'entre la pile et le tas il y a au moins une page sur laquelle on n'a pas les droits.

    Sous Windows (où il me semble que c'est explicitement spécifié, d'ailleurs), cela se traduit par une exception Win32 STATUS_STACK_OVERFLOW. Le symptôme visible est (était?) que le programme crashe immédiatement sans boîte de dialogue de rapport d'erreurs, car il n'y a même plus assez de pile pour lancer le programme approprié.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Tu parles de coût mémoire ou de temps de calcul?

    De manière générale, vaux mieux éviter la récursion, après il y a toujours des cas particuliers.

  10. #10
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Citation Envoyé par LinuxUser Voir le message
    Tu parles de coût mémoire ou de temps de calcul?
    C'était mal dis, je l'ai rectifié.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Cours : algorithmes et récursivité
    Par Community Management dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 17/10/2018, 00h38
  2. [Système] Récursivité et itération
    Par Floréal dans le forum Langage
    Réponses: 8
    Dernier message: 19/04/2005, 14h57
  3. Parcours d'arbre sans récursivité
    Par Morvan Mikael dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 12/04/2005, 13h57
  4. [PS] Récursivité !
    Par maitrebn dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/10/2004, 12h18
  5. récursivité
    Par krimson dans le forum PostgreSQL
    Réponses: 12
    Dernier message: 06/05/2004, 15h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo