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 :

récursivité pour une somme


Sujet :

Macros et VBA Excel

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut récursivité pour une somme
    Bonjour, suite au conseil d'un modérateur je repose une question dans laquelle les réponses était plutot floues pour moi . On sait que la somme des carrés des entiers est définie par n(n+1)(2n+1) / 6.

    J'ai voulu crée une fonction récursive qui pour un entier x calcule la somme des carrés de 0 à x , voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function toutou(ByVal x As Long) As Long
     
    If x >= 0 Then
        toutou = (x - 1) * ((x + 1) * (2 * x + 1)) / 6
    Else
        toutou = x
    End If
    End Function
    Suite aux relectures de mes anciens post et de vos conseils je fais moins d'erreurs mais ça ne marche tjs pas . Ici ma fonction compile bien , je décrémente n ( car dans une récursivité faut tjs décrémenter la variable n'est ce pas ???? ) .
    Ici pour x = 20 j'obtiens 2726 au lieu de 2870 , donc le probleme vient il de ma fonction en terme de code ou de la formule de maths ?

    merci de votre aide , et je vous en prie ne me donnez pas de réponses toutes faites , je préfère des conseils pour que j'essaye moi meme de modifier le code .

  2. #2
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    bonjour
    Si tu cherches n(n+1)(2n+1) / 6, écris

    toutou = (x) * ((x + 1) * (2 * x + 1)) / 6

    cordialement

  3. #3
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    ok fred mais pgz m'a dit que dans une récursivité il fallait décrémenter la variable , ici il n'y pas de décrémentation , surement parce que c'est une somme , donc j'ai une question théorique :

    dans le cas d'une récursivité , dans quel cas doit on décrémenter la variable ?

    merci

  4. #4
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    re

    mes cours de maths et définition sont très loin

    je ne voudrais pas te donner de mauvaises informations.
    Il me semble qu'une fonction récursive doit faire appelle à elle même
    ce que ne fait pas ta fonction où la condition x>= 0 ne sert à rien .

    La somme des carré de x = x² + somme des carrés de (x -1)
    toutou (x) = x² + toutou(x-1)

    Edit le code corrigé dans 1/2 heure. À vos claviers

    @+

  5. #5
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    ça ira fred tt marche bien , la formule avec 2n+1 / 6 marche comme un gant , merci

  6. #6
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    Pour une fonction recursive
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function toutou2(x As Long) As Long
    If x > 1 Then
      toutou2 = x ^ 2 + toutou2(x - 1)
    Else
      toutou2 = toutou2 + 1 'ou x
    End If
    End Function
    Petite astuce (merci à Starec)

    pour visualiser le résultat dans visual basic

    Affiche la fenêtre d'exécution (ctrl G) et saisie dans cette fenêtre

    ? toutou(50)
    tapes sur enter, tu auras le résultat en dessous.

    Cordialement

  7. #7
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    impossible vu que ma fonction doit engloger la valeur 0 , toi tu mets x > 1 ...

  8. #8
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    re

    autant pour moi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function toutou2(x As Long) As Long
    If x > 0 Then
      toutou2 = x ^ 2 + toutou2(x - 1)
    Else:   toutou2 = x
    End If
    End Function
    cordialement

  9. #9
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    donc fred je repose ma question : dans une récursivité on décrémente OBLIGATOIREMENT? oui ou non?

    merci

  10. #10
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    re

    Honnêtement je ne sais pas ce qui est sûr c'est qu'elle doit s'appeler, tout comme les boucles d'oreille de la vache qui rit.


    Si tu ne décrémentes pas, il me semble que c'est sans fin (avec erreur de pile), je répondrais que oui, il faut décrémenter mais ne peux te l'affirmer.

    Attend qu'un pro passe par là pour te répondre.

    cordialement

  11. #11
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    Si la réponse est OUI je peux dire que j'aurais bien approfondi ma compréhension de la récursivité grâce à ton exemple , donc les enchères sont ouvertes , la question est :

    dans une fonction récursive doit on obligatoirement décrémenter la variable ?

    qui peut me répondre de manière totalement affirmative ?

  12. #12
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Il y a une condition sine qua non dans une fonction récursive, c'est qu'il faut mettre une condition qui annule la récursivité si.. à toi de voir.
    Parce que si la récursivité doit toujour arrivé à zéro ou à un nombre déterminé elle n'a aucun intèret.
    A+

  13. #13
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    alors la réponse est oui

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 75
    Points : 85
    Points
    85
    Par défaut
    Bonjour,

    Une fonction récursive doit avoir une fin (c'est le test x==0 dans ton cas). Il faut donc que le paramètre x finisse par rendre cette égalité vraie.

    Donc non, cela ne doit pas forcément décrémenter (même si en pratique c'est fréquemment ainsi), mais tendre vers une limite (0 ou autre).

    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int test(int x) {
        if (x<100) return test(x+2);
        else return 100;
    }
    et on lance le test : test(0)
    qui renverra 100 pour n'importe quel x.
    (c'est couillon comme exemple, je sais )

    Ca repond à la question ?

    PS: c'est du pseudo code, mais je pense que c'est assez clair...

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 75
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par LeForestier Voir le message
    Parce que si la récursivité doit toujour arrivé à zéro ou à un nombre déterminé elle n'a aucun intèret.
    A+
    Je ne comprends pas bien ? Il manque une négation ? non ?

  16. #16
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Explique un peu vers quel tendance ta récursivité doit arrivé... ?

  17. #17
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Citation Envoyé par Maxence45 Voir le message
    Bonjour, suite au conseil d'un modérateur je repose une question dans laquelle les réponses était plutot floues pour moi . On sait que la somme des carrés des entiers est définie par n(n+1)(2n+1) / 6.

    J'ai voulu crée une fonction récursive qui pour un entier x calcule la somme des carrés de 0 à x
    C'est ce que je lis ...

    La réponse est donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Command1_Click()
     Dim n As Integer
     n = 6
     MsgBox coucou(n)
    End Sub
    
    Private Function coucou(x As Integer) As Integer
      If x = 0 Then Exit Function
      coucou = x ^ 2
      coucou = coucou + coucou(x - 1)
    End Function

  18. #18
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    OK, Ton problème m'a un peu titillé et j'ai fait quelque test sur ce sujet....
    Et les réponse ne sont pas celles à la quel ont peu s'attendre..
    Voir un peu cet exemple qui en dit pas mal sur ce sujet...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Form_Load()
     e = Récursif(10)
    End Sub
    Function Récursif(N As Double) As Double
    Static M As Double
        N = N + 1
        M = N
        If M < 20 Then
            Récursif = N
            Call Récursif(N)
        End If
        Récursif = M
    End Function
    Sans la mémorisation de M, le retour est TOUJOURS le premier envoi, (je sais pas si je me fait bien comprendre) , si non j'y reviendrai..
    Et dans mon exemple, e est bien égal à 20 au retour.
    A+
    EDIT:
    Bonsoir Ucfoutu,
    Le problème est que lorsque la fonction se termine, elle renvoi la 1ére occurence de l'appel, d'où la variable Static qui elle va renvoyé la dernière valeur.

  19. #19
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Ayé ?

    Bon...

    ce qui peut donc s'écrire ainsi ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Function coucou(x As Integer) As Long
      If x = 0 Then Exit Function
      coucou = x ^ 2 + coucou(x - 1)
    End Function
    dur, hein ...

    Edit : j'ai typé la fonction en Long pour la cas où ton n serait plus gourmand, avec quand même une limite (1860)[/QUOTE]

  20. #20
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonsoir UcFoutu, comme d'hab, tu à été plus rapide, voir mon édit.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2010] Regrouper les critères pour une somme NB.SI
    Par Leakof dans le forum Excel
    Réponses: 4
    Dernier message: 22/11/2014, 23h32
  2. Procédure pour une somme en sql
    Par CatherH dans le forum Langage SQL
    Réponses: 4
    Dernier message: 01/06/2014, 11h46
  3. Réponses: 4
    Dernier message: 18/11/2010, 20h16
  4. Syntaxe pour une somme de cellules
    Par Potzo dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 24/06/2010, 14h27
  5. Réponses: 0
    Dernier message: 30/07/2008, 14h33

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