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

Macros et VBA Excel Discussion :

améliorer une fonction récursive


Sujet :

Macros et VBA Excel

  1. #21
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    alors je reprends :

    on entre dans la fonction avec 2 : 2 + 2f(1) - f(1)

    on entre dans la fonction avec 1 : 2 + 1 + 2f(0) - f(0)

    on entre dans la fonction avec 0 : 2 + 1 + 0 , on sort de la fonction et c'est censé afficher la résultat mais non ! ça affiche ça :

    appel de fctRec avec n = 0
    appel de fctRec avec n = 1
    appel de fctRec avec n = 0
    appel de fctRec avec n = 0


    donc ça veut dire qu'on re rentre avec 0 , avec 1 et avec 0 , 0 , pourquoi? ya t'il une explication simple à ce repassage dans la fonction?

  2. #22
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Tu penses à effacer le contenu de la fenêtre entre 2 exécutions?

    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
    Function fctRec(n As Integer) As Integer
    Debug.Print "appel n = " & n
    If n > 0 Then
        fctRec = n + 2 * fctRec(n - 1) - fctRec(n - 1)
    ElseIf n = 0 Then
        fctRec = 0
    Else
        fctRec = -1
    End If
     
    End Function
     
    Sub subggg()
    MsgBox fctRec(0)
    End Sub
    Avec Msgbox fctRec(0), résultat 0, debug
    appel n = 0
    Avec MsgBox fctRec(1), résultat 1, debug
    appel n = 1
    appel n = 0
    appel n = 0
    avec msgbox fctRec(2), résultat 3, debug
    appel n = 2
    appel n = 1
    appel n = 0
    appel n = 0
    appel n = 1
    appel n = 0
    appel n = 0
    avec msgbox fctRec(3), résultat 6, debug
    appel n = 3
    appel n = 2
    appel n = 1
    appel n = 0
    appel n = 0
    appel n = 1
    appel n = 0
    appel n = 0
    appel n = 2
    appel n = 1
    appel n = 0
    appel n = 0
    appel n = 1
    appel n = 0
    appel n = 0
    etc...

    Tu n'as pas cela?

  3. #23
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    mais si j'ai exactement cela , pour l'exemple n = 2 c'est ce que j'ai dit , je ne comprends pas pq une fois qu'on est passé dans la fonction avec n = 0 , on repasse avec n = 0 , n = 1 , n = 0 , n = 0 ce qui donne bien ce que tu as donné :

    appel n = 2
    appel n = 1
    appel n = 0
    appel n = 0 // c'est ce repassage que je n'arrive pas à saisir
    appel n = 1
    appel n = 0
    appel n = 0

  4. #24
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Et est-ce que tu comprends cela :
    Avec MsgBox fctRec(1), résultat 1, debug
    Citation:
    appel n = 1
    appel n = 0
    appel n = 0

  5. #25
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    non car je ne vois absolument pas pq on passe 2 fois avec 0 dans la fonction , une fois devrait suffir , on passe 2 fois car il y a 2 fonctions ? donc on en fait une à la fois ? aucun sens je dois me tromper .

  6. #26
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bon, voilà.

    Quand tu fais appel fctRec(1)
    (1 appel n = 1)
    tu trouves la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fctRec = n + 2 * fctRec(n - 1) - fctRec(n - 1)
    Donc tu vas appeler 2 fois fctRec(0), c'est ce que dit la ligne de code!

    Vois-tu maintenant?

  7. #27
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    hum oui ça commence à bien s'éclaircir , tu appeles 2 fois ta fonction car ya simplement 2 fois son nom ?

    c'est comme ici :
    SuiteN = (SuiteN(n - 1, x) + x / SuiteN(n - 1, x)) / 2
    vu que ya 2 fois son nom on l'appelle 2 fois pour n = 1 , 4 fois pour n = 2 ..

    si j'avais 3 fois le nom de ma fonction ça serait 3 fois pour n = 1 , 8 fois pour n = 2 , c'est bien cela ?

  8. #28
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Exactement!
    Tu commences à comprendre?

    ET si tu regardes maintenant ce que t'a proposé Philben, c'est de n'appeler ta fonction qu'une fois à chaque récursivité, même si tu utilises 2 fois le résultat dans la formule. Tu vois la différence?

    Tu peux faire pareil : observer avec debug les 2 fonctions.

    PGZ

  9. #29
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    je commence à saisir oui , mais je ne comprends pas pq l'ordinateur n'éxécute pas les 0 en même temps , car le vb est un language ligne , et sur la meme ligne on a les 2 fonctions , il devrait passer 1 fois avec 0 au lieu de 2 fois ça reste quand même un mystère...

  10. #30
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Non, il n'y a aucun mystère :
    à chaque fois que tu écris le nom de la fonction, tu l'appelles.

    Si ta fonction s'appelle MaFonction

    si tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    variable = MaFonction(param)
    Resultat = variable *2 + variable^2 + variable^3
    Tu n'appelles la fonction qu'une fois.

    Mais si tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Resultat = MaFonction(param)*2 + MaFonction(param)^2 + Mafonction(param)^3
    Tu l'appelles 3 fois.
    Il n'y a qu'une ligne de code au lieu de 2, mais tu vas perdre un temps considérable...

  11. #31
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    donc pour cet ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fctRec = n + 2*fctRec(n-1) - fctRec(n-1)
    , l'ordinateur , pour n = 2 calcule comme ça :

    2 + 2*f(1) -> 2 + 1 + 2*f(0) -> on a déjà le 3 , et ensuite il fait :

    - f(0) ?

  12. #32
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Pour f(2) la machine fait

    f = 2 + 2* f(1) - f(1) elle doit évaluer f(1) et f(1)
    ----évaluation de f(1)
    ----f = 1 + 2 *f(0) - f(0) elle doit évaluer f(0) et f(0)
    --------évaluation de f(0)
    --------f = 0
    --------évaluation de f(0)
    --------f = 0
    ----f = 1 + 2*0 - 0 = 1
    ----évaluation de f(1)
    ----f = 1 + 2 *f(0) - f(0) elle doit évaluer f(0) et f(0)
    --------évaluation de f(0)
    --------f = 0
    --------évaluation de f(0)
    --------f = 0
    ----f = 1 + 2*0 - 0 = 1
    f = 2 + 2*1 -1 = 3

    Voilà. La machine ne réfléchit pas, elle exécute le code...

    A demain, si tu as besoin.

    Cordialement,

    PGZ

  13. #33
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    merci pgz pour ta patience là c'est bcp plus clair tu m'as grandement aidé , encore merci .

    et j'ajoute que je suis très content car grâce à ton dernier message j'ai approfondi ma compréhension de la récursivité .

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/06/2008, 12h08
  2. algorithme comportant une fonction récursive
    Par TraxX dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 21/02/2008, 16h09
  3. Réponses: 4
    Dernier message: 03/01/2008, 10h53
  4. [fonction d'Ackermann] Écrire une fonction récursive
    Par java+ dans le forum Mathématiques
    Réponses: 5
    Dernier message: 19/06/2007, 01h14
  5. Réponses: 6
    Dernier message: 24/05/2007, 17h18

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