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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    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 émérite
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    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
    Membre éclairé
    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
    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 émérite
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    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
    Membre éclairé
    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
    Par défaut
    ça ira fred tt marche bien , la formule avec 2n+1 / 6 marche comme un gant , merci

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    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
    Membre éclairé
    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
    Par défaut
    impossible vu que ma fonction doit engloger la valeur 0 , toi tu mets x > 1 ...

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

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

  10. #10
    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
    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]

  11. #11
    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
    Par défaut
    Bonsoir UcFoutu, comme d'hab, tu à été plus rapide, voir mon édit.

  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
    Par défaut
    En fait, j'en conclu ceci..
    Dans une fonction ont peut employer une valeur 'récursive' à l'INTERIEUR de la fonction' mais pas au 'RETOUR' de la fonction.

  13. #13
    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
    Par défaut
    Salut Leforestier...

    Une fonction récursive est simple à comprendre, si tu oublies tout simplement le mot fonction ...

    Imagine simplement... je ne sais pas, moi... des seaux d'eau, par exemple... ou encore ce que fait une balle de caoutchouc lorsque tu la laisses tomber à la verticale, etc...

    Il ne faut pas se laisser impressionner par les "grands mots", juste poser un regard simple...

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

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