OVH Cloud OVH Cloud

Boucle function

8 réponses
Avatar
John Smith
Bonjour,


Function test(text As String)
If text = "Bonjour" Then
test ("Rebonjour")
Else
test = text
End If
End Function

Private Sub Form_Load()
Debug.Print test("Bonjour")
End Sub

Dans mon debug.print j'ai rien mais j'aimerais que ca donne Rebonjour
Ma question est possible faire qu'une fonction se call elle meme

Merci

8 réponses

Avatar
Jacques93
Bonsoir John Smith,
John Smith a écrit :
Bonjour,


Function test(text As String)
If text = "Bonjour" Then
test ("Rebonjour")
Else
test = text
End If
End Function

Private Sub Form_Load()
Debug.Print test("Bonjour")
End Sub

Dans mon debug.print j'ai rien mais j'aimerais que ca donne Rebonjour
Ma question est possible faire qu'une fonction se call elle meme



C'est possible :

Function test(text As String)
If text = "Bonjour" Then
test = test("Rebonjour")
Else
test = text
End If
End Function

De manière générale, un classique de la récursivité (je crois l'avoir
fait en Pascal sur Apple II+), les tours de Hanoi :

http://vbfrance.com/code.aspx?ID86

--
Cordialement,

Jacques.
Avatar
Jean-Marc
"John Smith" a écrit dans le message de
news:ukP9f.4636$
Bonjour,


Function test(text As String)
If text = "Bonjour" Then
test ("Rebonjour")
Else
test = text
End If
End Function

Private Sub Form_Load()
Debug.Print test("Bonjour")
End Sub

Dans mon debug.print j'ai rien mais j'aimerais que ca donne Rebonjour
Ma question est possible faire qu'une fonction se call elle meme



Hello,

il faut un peu modifier pour faire ce que tu veux:

Function test(ByVal text As String) As String

If text = "Bonjour" Then
test = test("Rebonjour")
Else
test = text
End If
End Function

Private Sub Form_Load()
Debug.Print test("Bonjour")
End Sub

Ce que tu veux faire se nomme la récusrsivite.
C'est possible en VB, avec les inconvénients
propres à la récursivité.

Tu pourras trouver des infos avec Google "récursivité".

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
John Smith
Merci pour la réponse rapide


"Jacques93" wrote in message
news:
Bonsoir John Smith,
John Smith a écrit :
Bonjour,


Function test(text As String)
If text = "Bonjour" Then
test ("Rebonjour")
Else
test = text
End If
End Function

Private Sub Form_Load()
Debug.Print test("Bonjour")
End Sub

Dans mon debug.print j'ai rien mais j'aimerais que ca donne Rebonjour
Ma question est possible faire qu'une fonction se call elle meme



C'est possible :

Function test(text As String)
If text = "Bonjour" Then
test = test("Rebonjour")
Else
test = text
End If
End Function

De manière générale, un classique de la récursivité (je crois l'avoir fait
en Pascal sur Apple II+), les tours de Hanoi :

http://vbfrance.com/code.aspx?ID86

--
Cordialement,

Jacques.


Avatar
Jacques93
Bonsoir John Smith,
John Smith a écrit :
Merci pour la réponse rapide



De rien, je n'ai coiffé Jean-Marc que de 2 ou 3 minutes. Mais, fait
comme il l'indique, précise ce que renvoie ta fonction, c'est à dire :

Function test([ByVal ou ByRef ] x As ...) As ...

quand les appels récursifs sont nombreux, cela peut avoir des
conséquences notables sur les performances. J'ai été rapide, mais
incomplet...

--
Cordialement,

Jacques.
Avatar
John Smith
Est-ce qu'il y a moyen d'utiliser une autre voie pour éviter les problèmes
de performances



"Jacques93" wrote in message
news:
Bonsoir John Smith,
John Smith a écrit :
Merci pour la réponse rapide



De rien, je n'ai coiffé Jean-Marc que de 2 ou 3 minutes. Mais, fait comme
il l'indique, précise ce que renvoie ta fonction, c'est à dire :

Function test([ByVal ou ByRef ] x As ...) As ...

quand les appels récursifs sont nombreux, cela peut avoir des conséquences
notables sur les performances. J'ai été rapide, mais incomplet...

--
Cordialement,

Jacques.


Avatar
Jean-Marc
>"John Smith" a écrit dans le message de


news:%bQ9f.4665$
Est-ce qu'il y a moyen d'utiliser une autre voie pour éviter les problèmes
de performances



La récursivité peut, par sa nature même, conduire à des problèmes,
de 2 types:
- Performance
Les appels récursifs impliquent un grand nombre d'empilements
et de dépilements des fonctions et des paramètres. Tout ceci a
un coût, qui peut vite devenir un souci.

- Sécurité (fiabilité)
Le problème le plus fréquent ave les appels récursifs: le débordement
de pile; Si le nombre d'appels récursifs devient trop grand (et ça peut
arriver très vite), le programme consomme toute la mémoure jusqu'à un
débordement de pile conduisant à un plantage du programme.

Alors, y a t'il d'autres voies?
Oui il y en a, parfois. La récursivité terminale est moins couteuse
que la récursivité non terminale:
http://cermics.enpc.fr/polys/info1/main/node22.html
En fait, un bon compilateur saura remplacer des appels récursifs
terminaux par du code itératif.

La récursivité doit s'employer à boin escient, c'est parfois un
bon moyen (exemple: le problème des tours de Hanoi, comme indiqué
par Jacques). Dans d'autre cas, il est inutile et peu efficace
(voire très mauvais) de recourir à la récursivité (exemple: le
calcul de la fonction factorielle).

Le cas que tu donnais en exemple ("Bonjour" => "Rebonjour") ne
se programmerait certainement pas avec un appel récursif dans un
vrai programme.

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
John Smith
Finalement j'ai pas besoin d'une function mais d'une sub
Voici ce que je veux avoir comme info
Pour un labo d'anlayse chimique (exemple pas vrai)
Parametre->addparametre
Durete-> Calcium + Magnésium
Parametre->addparametre
Calcium -> Nitrite


Donc je veux savoir si je fais la dureté c'est quoi que ca implique

Petit code rapido mais qui va se conntecté sur un base de donné avec une
table parametre et une table addparametre
Public idparametre As New Collection
Public idsousparametre As New Collection

Private Sub Form_Load()
'loop par exemple les parametre qu'un utilisateur a choisit
parametre "Dureté"
Dim i As Integer
For i = 1 To idparametre.Count
Debug.Print idparametre(i)
Next
End Sub

Sub parametre(id As String)
idparametre.Add id
Call addpara(id)
End Sub


Sub addpara(id As String)
'loop dans une table addparametre
If id = "Dureté" Then
parametre ("Calcium")
parametre ("Magnésium")
End If
If id = "Calcium" Then
parametre "Nitrite"
End If
End Sub


Si vous pensez avoir une meilleur facon faite moi signe




"Jean-Marc" wrote in message
news:4367d4d7$0$4167$
>"John Smith" a écrit dans le message de
news:%bQ9f.4665$
Est-ce qu'il y a moyen d'utiliser une autre voie pour éviter les
problèmes
de performances



La récursivité peut, par sa nature même, conduire à des problèmes,
de 2 types:
- Performance
Les appels récursifs impliquent un grand nombre d'empilements
et de dépilements des fonctions et des paramètres. Tout ceci a
un coût, qui peut vite devenir un souci.

- Sécurité (fiabilité)
Le problème le plus fréquent ave les appels récursifs: le débordement
de pile; Si le nombre d'appels récursifs devient trop grand (et ça peut
arriver très vite), le programme consomme toute la mémoure jusqu'à un
débordement de pile conduisant à un plantage du programme.

Alors, y a t'il d'autres voies?
Oui il y en a, parfois. La récursivité terminale est moins couteuse
que la récursivité non terminale:
http://cermics.enpc.fr/polys/info1/main/node22.html
En fait, un bon compilateur saura remplacer des appels récursifs
terminaux par du code itératif.

La récursivité doit s'employer à boin escient, c'est parfois un
bon moyen (exemple: le problème des tours de Hanoi, comme indiqué
par Jacques). Dans d'autre cas, il est inutile et peu efficace
(voire très mauvais) de recourir à la récursivité (exemple: le
calcul de la fonction factorielle).

Le cas que tu donnais en exemple ("Bonjour" => "Rebonjour") ne
se programmerait certainement pas avec un appel récursif dans un
vrai programme.

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;








Avatar
Patrice Henrio
Un select case me parait tout indiqué

Sub addpara(id As String)
'loop dans une table addparametre
Select case id
Case "Dureté"
parametre ("Calcium")
parametre ("Magnésium")
Case "Calcium" $
parametre "Nitrite"
Case else
'cas non prévus
End select
End Sub

"John Smith" a écrit dans le message de news:
p5R9f.4086$
Finalement j'ai pas besoin d'une function mais d'une sub
Voici ce que je veux avoir comme info
Pour un labo d'anlayse chimique (exemple pas vrai)
Parametre->addparametre
Durete-> Calcium + Magnésium
Parametre->addparametre
Calcium -> Nitrite


Donc je veux savoir si je fais la dureté c'est quoi que ca implique

Petit code rapido mais qui va se conntecté sur un base de donné avec une
table parametre et une table addparametre
Public idparametre As New Collection
Public idsousparametre As New Collection

Private Sub Form_Load()
'loop par exemple les parametre qu'un utilisateur a choisit
parametre "Dureté"
Dim i As Integer
For i = 1 To idparametre.Count
Debug.Print idparametre(i)
Next
End Sub

Sub parametre(id As String)
idparametre.Add id
Call addpara(id)
End Sub


Sub addpara(id As String)
'loop dans une table addparametre
If id = "Dureté" Then
parametre ("Calcium")
parametre ("Magnésium")
End If
If id = "Calcium" Then
parametre "Nitrite"
End If
End Sub


Si vous pensez avoir une meilleur facon faite moi signe




"Jean-Marc" wrote in message
news:4367d4d7$0$4167$
>"John Smith" a écrit dans le message de
news:%bQ9f.4665$
Est-ce qu'il y a moyen d'utiliser une autre voie pour éviter les
problèmes
de performances



La récursivité peut, par sa nature même, conduire à des problèmes,
de 2 types:
- Performance
Les appels récursifs impliquent un grand nombre d'empilements
et de dépilements des fonctions et des paramètres. Tout ceci a
un coût, qui peut vite devenir un souci.

- Sécurité (fiabilité)
Le problème le plus fréquent ave les appels récursifs: le débordement
de pile; Si le nombre d'appels récursifs devient trop grand (et ça peut
arriver très vite), le programme consomme toute la mémoure jusqu'à un
débordement de pile conduisant à un plantage du programme.

Alors, y a t'il d'autres voies?
Oui il y en a, parfois. La récursivité terminale est moins couteuse
que la récursivité non terminale:
http://cermics.enpc.fr/polys/info1/main/node22.html
En fait, un bon compilateur saura remplacer des appels récursifs
terminaux par du code itératif.

La récursivité doit s'employer à boin escient, c'est parfois un
bon moyen (exemple: le problème des tours de Hanoi, comme indiqué
par Jacques). Dans d'autre cas, il est inutile et peu efficace
(voire très mauvais) de recourir à la récursivité (exemple: le
calcul de la fonction factorielle).

Le cas que tu donnais en exemple ("Bonjour" => "Rebonjour") ne
se programmerait certainement pas avec un appel récursif dans un
vrai programme.

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;