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 :

fonction récursive un peu lente


Sujet :

Macros et VBA Excel

  1. #41
    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
    En récursivité tu dis : F(n) = F(n-1) + F(n-2),
    puis avec la même relation tu évalues F(n-1) ...

    En itératif tu dis :
    F(0) = 0
    F(1) = 1
    F(2) = F(0) + F(1)
    Etc..
    jusqu'à F(n).

    Tu ne vois pas la différence?

  2. #42
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    non je ne vois pas du tout comment mettre ça dans une boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For i = 0 To n
        x = i
        y = i + 1
        z = x + y
    Next i
     
    fibonacci = z
    ça marche pas

  3. #43
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    Bon, allez...
    y'en a marre des récursif et itératifs et tout le bazard !
    Le même, mais en une seule ligne !
    Et paf !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function fibo(n As Long) As Long
        fibo = 1 / Sqr(5) * (((1 + Sqr(5)) / 2) ^ n - ((1 - Sqr(5)) / 2) ^ n)
    End Function



    Le pire, c'est que ça marche



    Sinon, tu te rapproches dangereusement de la solution !

  4. #44
    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
    Ca ne marche pas mais cette fois tu t'approches.
    Exécutes ton code et suit le pas à pas, tu vas comprendre où le bât blesse et améliorer...

  5. #45
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    @pgz !
    J'ai du mal à départager ta fastFibo et ma dernière fibo en terme de rapidité de traitement...
    TU peux me donner des stats sur ton poste ?
    Moi, même en utilisant GetTickCount, sur mon PC, les deux renvoient 0 pour une F(n) où n=20
    La récursive du départ ne me renvoyant que 16
    (ben oui, il va vite mon P, et alors)

  6. #46
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    pgz t'es certain que je peux mettre mes 3 variables dans une boucle et rien mettre en dehors de la boucle ?

  7. #47
    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
    @Maxence.
    Pour mesurer je calcule 10 000 fois F(n). Je mesure ausi avec GetTickCount& et je divise par 10 000.

    Pour FastFibo, j'obtiens 15 µs ,
    Pour ma FiboIter, j'obtiens 5 µs.

    Tu veux que je mesure ta formule?

    @Shaku.

    Il faut que tu ilitialises quelque chose avant la boucle.

  8. #48
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    je précise que je n'ai vu que des boucles for basiques , et avec cette architecture de boucle je vois pas comment avec 3 variables, tomber sur le bon résultat

  9. #49
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    Citation Envoyé par pgz Voir le message
    @Maxence.
    Pour mesurer je calcule 10 000 fois F(n). Je mesure ausi avec GetTickCount& et je divise par 10 000.

    Pour FastFibo, j'obtiens 15 µs ,
    Pour ma FiboIter, j'obtiens 5 µs.

    Tu veux que je mesure ta formule?
    Ouaip !
    pour voir ...
    à priori, la formule en 1 ligne va environ 3 fois plus vite que la fastFibo

  10. #50
    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
    @Maxence.

    J'ai oublié de préciser : je calcule F(30).

    Avec ta formule : 1,6 µs.

    Ma machine est lambda. On retombe sur les limite de GetTickCount, on dirait que l'incrément de mesure est 16 ms.

    ET 16 ms / 10 000 = ...

  11. #51
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    là j'ai vraiment aucune idée sur cette question , je ne sais pas quoi ni comment initialisé quelque chose dans ce cas , je ne sais pas quand ma boucle doit commencer , où mettre une initialisation...

    bref je ne comprends rien donc si tu veux mettre un code tout fait tu peux j'abandonne .

  12. #52
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    procedure fibonacci (n : entier non négatif)

    si n = 0 alors y := 0

    sinon
    début

    x := 0
    y := 1

    pour i := 1 à n−1

    début

    z := x + y
    x := y
    y := z

    fin
    fin
    y est le n-ième nombre de Fibonacci

    @PGZ
    Voici les stats que j'obtiens pour F(40) en 10 000 itérations
    FIBO : 0,0015
    FASTFIBO : 0,0078
    Soit 5 fois plus rapide !
    et... il ne descend pas sous 0.0015

  13. #53
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    ah ben vous m'aviez pas dit que je devais mettre des alternatives j'en savais rien moi j'aurais pû chercher longtemps!!!

    merci bien maxence je vais essayer de traduire ça , et merci aussi pgz .

  14. #54
    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
    @Shaku.

    En voilà un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function fctFiboIter(ByVal n As Integer) As Long
    Dim FnMoins1 As Long, FnMoins2 As Long, i As Integer
     
    FnMoins2 = 0
    FnMoins1 = 1
    fctFiboIter = n
     
    For i = 2 To n
        fctFiboIter = FnMoins1 + FnMoins2
        FnMoins2 = FnMoins1
        FnMoins1 = fctFiboIter
    Next i
     
    End Function
    @Maxence

    Mesure avec F(30), 100 000 calculs entre deux mesures de temps:
    FastFibo : 13 µs
    FiboIter (ci-dessus) : 3,8 µs
    Ta fonction : 1,7 µs

    En absolu, faut être prudent mais en relatif, c'est net.

  15. #55
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    merci bcp pgz , je vais sérieusement revoir mon étude des boucles car là j'ai du soucis à me faire , encore merci à vous 2 .

  16. #56
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    J'ai voulu faire mon malade mental ...

    500k itérations F(40)
    FastFibo= 0,00471
    Fibo = 0,00103

    Après, je teste à 1000k itérations F(40)
    FastFibo= 0,004742
    Fibo= 0,000952

    Quelle que soit la manière, c'est super rapide cette formule ! étonnant de rapidité !
    Entre 4 et 5 fois plus rapide !
    Je suis soufflé !

  17. #57
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    juste un truc pgz , dans mes cours après le next ya tjs une instruction de retour du genre fonction = ...

    pq tu n'en mets pas toi ?

  18. #58
    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
    Parce que là, je l'ai fait avant. Pour toi, il aurrait été plus clair de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function fctFiboIter(ByVal n As Integer) As Long
    Dim FnMoins1 As Long, FnMoins2 As Long, i As Integer, A as long
     
    FnMoins2 = 0
    FnMoins1 = 1
    A = n
     
    For i = 2 To n
        A = FnMoins1 + FnMoins2
        FnMoins2 = FnMoins1
        FnMoins1 = A
    Next i
    fctFiboIter = A
    End Function
    Mais ce n'est pas mieux, non?

  19. #59
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    ok je vois , j'ai excel 2003 , hier tu m'as montré grâce à une astuce avec cette ligne : Debug.Print "appel n = " & n , comment voir l'execution pas à pas .

    J'aimerais aussi voir cette éxécution avec la boucle , je dois mettre cette ligne où ? Je ne peux pas voir l'execution pas à pas autrement que pas cette ligne ?

  20. #60
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    @PGZ !
    Par contre, fastFibo est plus rapide sur les petites valeurs de n !!

    @SHAKU
    Regardes dans le menu Débogage : Tu peux mettre un point d'arrêt à un endroit (F9) et avancer pas à pas (F8)
    Tu as aussi, dans le menu affichage une fenêtre intéressante : la fenêtre des variables locales

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. [VB6] XML, fonction récursive de recherche
    Par kboo dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/04/2006, 21h27
  2. [XSLT] fonction récursive à N niveaux
    Par Mike35 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/03/2006, 12h30
  3. Fonction récursive renvoi sur page d'erreur
    Par peck dans le forum Langage
    Réponses: 1
    Dernier message: 23/12/2005, 10h08
  4. Problème de fonction récursive avec un TcxDBTreeList
    Par isachat666 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 05/12/2005, 13h12
  5. Programme un peu lent
    Par gege2061 dans le forum GTK+
    Réponses: 4
    Dernier message: 08/07/2004, 17h42

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