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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut améliorer une fonction récursive
    Bonsoir , j'ai écrit une petite fonction vba , mais quand je la teste avec des valeurs moyennes , ça fait bugger mon pc car ma fonction n'est pas optimisée , la voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Function SuiteN(ByVal n As integer, ByVal x As Double) As Double
    'Renvoie une valeur approchée de la racine de x
    If n = 0 Then
        SuiteN = x / 2
    ElseIf n > 0 Then
        SuiteN = (SuiteN(n - 1, x) + x / SuiteN(n - 1, x)) / 2
    Else
        SuiteN = -1
    End If
    End Function
    Ma 1ere question est : quelqu'un peut il m'indiquer précisément comment je peux tester la fonction pas à pas avec toutes les étapes , que puis je écrire comme petite procédure et dans quelle fenêtre puis je voir les étapes?

    Ma seconde question : si je fais Newton(30;2) , ça bug car 30 est trop grand , qu'est ce que je dois améliorer ici svp , le nombre de récursions sur n ? avez vous un indice ? Je ne souhaite pas une réponse tte faite je veux chercher , donc si vous avez un indice je suis preneur .

    Je vous remercie .

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Par défaut
    bonjour,

    pour la première question, vous pouvez faire un debug pas à pas dans VBE en mettant un point d'arrêt dans le code (cliquer sur la marge à gauche de la ligne d'instruction désirée) puis F8 pour avancer pas à pas.

    pour la seconde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Function SuiteN(ByVal n As Integer, ByVal x As Double) As Double
    'Renvoie une valeur approchée de la racine de x
       Dim dVal As Double
       If n > 0 Then
          dVal = SuiteN(n - 1, x)
          SuiteN = (dVal + x / dVal) / 2
       ElseIf n = 0 Then
          SuiteN = x / 2
       Else
          SuiteN = -1
       End If
    End Function
    c'est à dire économiser pour conserver votre pouvoir de calcul

    Philippe

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    je n'avais dit pas de réponse toute faite résultat j'ai rien compris et ça m'a pourri mon exercice , merci

    je vois pas du tout en quoi on économise du calcul , quelqu'un a t'il une explication car des résultats tout faits ça me sert à rien !

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Par défaut
    C'est une méthode anglo-saxonne : Comprendre par l'exemple

    Philippe

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    tu fais le lien entre une variable et la fonction n-1 , en quoi tu économises du calcul vu que tu fais tjs les calculs ...

    en plus là ma fonction n'est plus récursive vu qu'elle ne s'appelle plus ce que je n'ai pas le droit de faire...

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Par défaut
    ok,

    1) Vois-tu une différence de résultats entre les 2 fonctions quelque soit n et x ?

    2) Vois-tu une différence de temps d'exécution entre les 2 fonctions avec n = 23 par exemple ?

    Philippe

  7. #7
    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
    Hello.

    Je crois que ton pb vient de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SuiteN = (SuiteN(n - 1, x) + x / SuiteN(n - 1, x)) / 2
    A chaque appel récursif le contexte de la procédure d'appel est empilé. Si tu appelles 30 fois, cela empile 30 contextes. Très viable.
    Par contre ici tu appelles 2 fois sur la même ligne ta fonction. DOnc la 1ère fois 2 empilements qui chacun en provoquent 2 autres, soit 4, qui en provoquent 2 autres, soit 8, ... soit au final de l'ordre de 2^n. Avec 30 cela commence à faire beaucoup. Donc ton erreur doit indiquer un débordement de pile ou de capa mémoire.
    Le code de Philben résoud le problème. Et il est bien récursif puisqu'il s'appelle.

    En espérant que cela t'aide,

    PGZ

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

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