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 :

probleme fonction recursive


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Août 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 47
    Par défaut probleme fonction recursive
    bonjour tous,
    je veut savoir comment un compilateur traite cette fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //juste un exemple
    int f(n) int n;
    {
       if (n<0)return 1;
     
       y=3*n;
       f(n-1);
       f(n-3);
    }
    la question est:
    quand on arive a l'instruction "f(n-1);" en va reprendre f avec le parametre n-1;
    mais apres est qu'il va passer au instruction suivant "f(n-2);" ou il va appeler de nouveau f((n-1)-1)?

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par radouane_as
    bonjour tous,
    je veut savoir comment un compilateur traite cette fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //juste un exemple
    int f(n) int n;
    {
       if (n<0)return 1;
     
       y=3*n;
       f(n-1);
       f(n-3);
    }
    la question est:
    quand on arive a l'instruction "f(n-1);" en va reprendre f avec le parametre n-1;
    mais apres est qu'il va passer au instruction suivant "f(n-2);" ou il va appeler de nouveau f((n-1)-1)?
    Non je ne pense pas, surtout qu'une fois la condition de sortie effectuée, il remonte dans la pile des appels, d'ailleurs ta tonction n'est pas bien écrite, du moins au début même pour un code d'exemple... et en plus tu n'as même pas déclaré la variable y ! En plus cette variable ici ne sert strictement à rien du tout !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //juste un exemple
    int f (int n)
    {
       int y = 0;
     
       if (n<0) return 1;
     
       y=3*n;
       f(n-1);
       f(n-3);
    }
    Tu peux lire un des mes tutoriels sur la récursivité: Récursivité en Langage C, en espérant que ca t'aidera à comprendre les mécanismes de bases de la récursivité
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre averti
    Inscrit en
    Août 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 47
    Par défaut
    mon probleme c'est que je veut parcourir un arbre binaire copletemet:
    le code est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    node n;
    node parcours (node n)
    {
     
     
       if (n==null) return null;
    //je veut chercher un noeud particulier
       switch(n.type)
    {case a://a est un entier
    return n;
    default:
    parcours(droit(n));//fils droite de n aussi c'est un noeud
    parcours(gauche(n));//fils gauche de n aussi c'est un noeud
    return;
    }
    }
    est ce que ca permet de parcourer tout l'arbre.

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Arf les arbres je suis pas encore un grand spécialiste(je suis justement en train de les étudier)... mais ce que je peut te dire c'est que tu fait en ce moment même du C année 70

    Cette forme de fonction n'existe carrément plus, m'étonne qu'un compilateur l'accepte encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    node n;
    node parcours (node n)
    Une version plus à jour et dans l'air du temps serait:
    En tout cas, ce que je sais, c'est que l'algorithme change suivant le type de parcours que tu veux... un parcours en profondeur ? Si en profondeur, quel type: préfixe, infixe, suffixe? Un parcours en largeur ?
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre averti
    Inscrit en
    Août 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 47
    Par défaut
    moi je veut faire un parcours en profendeur.

    "pour la declaration de n au dessus c'est un oublit merci"

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par radouane_as
    moi je veut faire un parcours en profendeur.

    "pour la declaration de n au dessus c'est un oublit merci"
    Mais quel type de parcours en profondeur très exactement ? Il en existe trois si tu veux tout savoir !

    • Préfixe
    • Infixe
    • Suffixe


    Il faut choisir car l'ordre de parcours change !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Membre averti
    Inscrit en
    Août 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 47
    Par défaut
    Citation Envoyé par Franck.H
    Mais quel type de parcours en profondeur très exactement ? Il en existe trois si tu veux tout savoir !

    • Préfixe
    • Infixe
    • Suffixe


    Il faut choisir car l'ordre de parcours change !
    un parcours prefixe en profondeur.

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par radouane_as
    un parcours prefixe en profondeur.
    Ok donc voici un algorithme possible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Parcours (Abre N)
    {
        Tester (N)
     
        Si Gauche_non_vide Alors
           Parcours (gauche (N))
        FinSi
     
        Si Droite_non_vide Alors
           Parcours (droite (N))
        FinSi
    }
    En espérant avoir pû t'aider
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Membre averti
    Inscrit en
    Août 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 47
    Par défaut
    merci bien de ton aide.

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par radouane_as
    merci bien de ton aide.
    De rien, y'a juste ma première réponse qui n'était pas vraiment juste, j'avais oublié le fait que les appels sont faits entièrement, donc le premier puis une fois celui-ci terminé, le second qui est fait ... manque d'inattention
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  11. #11
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Il y quand même un gros problème dans ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    node parcours (node n)
    {
        if (n==null) 
            return null;
        //je veut chercher un noeud particulier
       switch(n.type)
      {
         case a://a est un entier
                   return n;
        default:
                 parcours(droit(n));//fils droite de n aussi c'est un noeud
                 parcours(gauche(n));//fils gauche de n aussi c'est un noeud
                return;
       }
    }
    Celà ne devrait jamais compiler : parcours doit retourner un noeud, dans le default il ne retourne rien.
    D'autre part, la valeur de retour n'est pas récupérée après parcours (droit(n)) et parcours(gauche(n)), alors, pourquoi retourner une valeur si elle ne sert à rien ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  12. #12
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Trap D
    Celà ne devrait jamais compiler : parcours doit retourner un noeud, dans le default il ne retourne rien.
    D'autre part, la valeur de retour n'est pas récupérée après parcours (droit(n)) et parcours(gauche(n)), alors, pourquoi retourner une valeur si elle ne sert à rien ?
    Tout à fait
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. probleme avec la fonctions recursive
    Par akkinaj dans le forum Débuter
    Réponses: 2
    Dernier message: 16/07/2008, 12h30
  2. [Syntaxe] Probleme Fonction Recursive C++
    Par selimen dans le forum C++
    Réponses: 6
    Dernier message: 30/05/2007, 15h23
  3. [C#] probleme avec une fonction recursive
    Par K_!!! dans le forum ASP.NET
    Réponses: 2
    Dernier message: 01/08/2006, 18h22
  4. [XSL]Probleme fonction recursive
    Par Le-Cortex dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 12/12/2005, 15h10
  5. probleme sql, fonction recursive
    Par CaptainChoc dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/11/2005, 01h45

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