Somme carres sur vba

[Résolu]
Signaler
Messages postés
9
Date d'inscription
dimanche 24 février 2008
Statut
Membre
Dernière intervention
16 mars 2008
-
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
-
bonjour

j'ai deux fonctions une récursive et l'autre itérative qui renvoie la somme des carres dess entiers compris entre  1 et n :

Function sommeDesCarresRec(ByVal n As Long) As Long
If n > 1 Then
sommeDesCarresRec = n ^ 2 + sommeDesCarresRec(n - 1)
Else
sommeDesCarresRec = n
End If
End Function


Sub sommeDesCarresRe()


    MsgBox sommeDesCarresRec(5)
   
End Sub


Function sommeDesCarres(ByVal n As Long) As Long
Dim i As Long
For i = 1 To n
sommeDesCarres = n ^ 2 + sommeDesCarres
Next i
End Function


Sub sommeDesCarre()


    MsgBox sommeDesCarres(5)
   
End Sub

Seul hic c'est que ces deux fonctions ne renvoient pas le meme résultat (55  et 125 ) ; quelqu'un aurait il un meilleur moyen pour réecrire ma fonction itérative ?
enfin , y'aurait il un moyen de comparer les deux fonctions sur vba ?

Julien

7 réponses

Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Private Sub Command1_Click()
  MsgBox sommeDesCarresRec(5)
  MsgBox sommeDesCarres(5)
End Sub


Function sommeDesCarresRec(ByVal n As Long) As Long
  While n > 0
    sommeDesCarresRec = n ^ 2 + sommeDesCarresRec
    n = n - 1
  Wend
End Function


Function sommeDesCarres(ByVal n As Long) As Long
  Dim i As Long
  For i = 1 To n
     sommeDesCarres = i ^ 2 + sommeDesCarres
  Next i
End Function


 
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Excuses

J'ai écrit 2 itératives...

Voilà la récursive :

Function sommeDesCarresRec(ByVal n As Long) As Long
    If n = 0 Then Exit Function
    sommeDesCarresRec = n ^ 2 + sommeDesCarresRec(n - 1)
End Function
Messages postés
9
Date d'inscription
dimanche 24 février 2008
Statut
Membre
Dernière intervention
16 mars 2008

merci jmfmarques pour la fonction itérative , en effet j'ai pensé à utilisé while mais il faut que je m'entraine plus sur les boucles ...
par contre y'aurait il un moyen de comparer le résultat des deux fonctions sur VBA , par exemple avec une fonction testSommeDesCarres qui pourrait  comparer les résultats des deux versions  pour un n donné ?

Julien
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Ben....
C'est tout simplement la même chose que pour la comparaison de deux variables dont chacune serait le résultat de l'une des deux fonctions !!!


 


dim toto as long, titi as long, tata as long
toto = 5  ' ou ce que tu veux d'autre)


titi = sommeDesCarresRec(toto)
tata = sommeDesCarres(toto)

et tu compares titi avec tata !!!...
Messages postés
9
Date d'inscription
dimanche 24 février 2008
Statut
Membre
Dernière intervention
16 mars 2008

j'ai essayé avec cette fonction et apparemment ça marche :

Function testSommeDesCarres(ByVal n As Long, ByVal m As Long, ByVal p As Long) As Boolean


n = 5
m = sommeDesCarresRec(n)
p = sommeDesCarres(n)


If m = p Then
testSommeDesCarres = "vrai"
Else
testSommeDesCarres = "faux"
End If


End Function


Sub testSommeDesCarre()


    MsgBox testSommeDesCarres(5, 5, 5)
   
End Sub
Messages postés
9
Date d'inscription
dimanche 24 février 2008
Statut
Membre
Dernière intervention
16 mars 2008

mais je ne suis pas sur de l'application quand je mets testSommeDesCarres (5 ,5, 5 ) , car m et p ne valent pas 5
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Je ne sais pas où tu veux en venir (car les deux fonctionneront et le résultat sera toujours True), mais voilà :

Private Sub Command1_Click()
  Dim toto As Integer
  toto = 5
  MsgBox verifions(toto)
End Sub


Function sommeDesCarresRec(ByVal n As Long) As Long
    If n = 0 Then Exit Function
    sommeDesCarresRec = n ^ 2 + sommeDesCarresRec(n - 1)
End Function


Function sommeDesCarres(ByVal n As Long) As Long
  Dim i As Long
  For i = 1 To n
     sommeDesCarres = i ^ 2 + sommeDesCarres
  Next i
End Function

Private Function verifions(essai) As Boolean
  verifions = True
  If sommeDesCarres(essai) <> sommeDesCarresRec(essai) Then verifions = False
End Function


Si tu veux Falmse comme résultat, il te faudra bien évidemment "fausser" l'une des deux fonctions