OVH Cloud OVH Cloud

Fonction Recursive

8 réponses
Avatar
Jessy Sempere [MVP]
Bonjour à tous

J'ai fais un bout de code sous Access donc en VBA...

Ce code utilises une fonction récursive qui marche très bien, par contre
elle a 2 arguments :
- un de type string,
- et un tableau.

Les 2 évolues en fonction du niveau de récursivité.

Le problème est la lenteur de cette récursivité, pour éventuellement
accélérer tout ça, j'ai retranscrit
mon code en VB .NET sous visual studio .net...

A mon grand désespoir, la récursivité pour l'argument de type string
fonctionne mais pas celle pour l'argument tableau, celui-ci ne garde par ses
valeurs en fonction du son niveau de récursivité ???

Ma question est donc peut-on faire sous VB .NET une fonction récursive avec
un
argument tableau où est-ce impossible ???

Merci à tous de vos lumière.

@+
Jessy Sempere - Access MVP
news@access.fr.vu
------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://www.mpfa.info/
------------------------------------

8 réponses

Avatar
TroXsA
Bonjour,

Voilà un exemple de récursivité avec tableau ArrayList
http://www.troxsa.info/index.php?option=com_content&task=view&id&Itemid=2

je sais pas si c'est bien ça que vous cherchiez ! mais bon ça peut aidé !

Cordialement

--

Mail : http://cerbermail.com/?rIXgaw9Xsl
Site : http://troxsa.info


"Jessy Sempere [MVP]" a écrit dans le message de
news: 43f477f0$
Bonjour à tous

J'ai fais un bout de code sous Access donc en VBA...

Ce code utilises une fonction récursive qui marche très bien, par contre
elle a 2 arguments :
- un de type string,
- et un tableau.

Les 2 évolues en fonction du niveau de récursivité.

Le problème est la lenteur de cette récursivité, pour éventuellement
accélérer tout ça, j'ai retranscrit
mon code en VB .NET sous visual studio .net...

A mon grand désespoir, la récursivité pour l'argument de type string
fonctionne mais pas celle pour l'argument tableau, celui-ci ne garde par
ses
valeurs en fonction du son niveau de récursivité ???

Ma question est donc peut-on faire sous VB .NET une fonction récursive
avec
un
argument tableau où est-ce impossible ???

Merci à tous de vos lumière.

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://www.mpfa.info/
------------------------------------





Avatar
Jessy Sempere [MVP]
Re,

Merci pour ta réponse...
En fait je pense savoir d'où viens le problème, en VBA, les arguments passer
dans une fonction sont passer par défaut par référence, surtout un argument
tableau qui ne peut pas être passé par valeur...
Visiblement, sous VB.NET, cette contrainte n'éxiste pas lorsque j'ai
retranscri mon code VBA sous VB.NET, il m'a mis pour tous mes arguments
ByVal y compris pour mon argument tableau...

Je ne peux pas tester au boulot mais je testerais ce soir pour vérifier ma
théorie ???

Sinon, en terme de rapidité, est ce qu'après compilation de mon code si il
fonctionne j'aurais les même performances que si je faisais plus ou moins le
même code sous C ???

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://www.mpfa.info/
------------------------------------
"TroXsA" a écrit dans le message de
news:dt1u5u$nab$
Bonjour,

Voilà un exemple de récursivité avec tableau ArrayList



http://www.troxsa.info/index.php?option=com_content&task=view&id&Itemid=2

je sais pas si c'est bien ça que vous cherchiez ! mais bon ça peut aidé !

Cordialement

--

Mail : http://cerbermail.com/?rIXgaw9Xsl
Site : http://troxsa.info


"Jessy Sempere [MVP]" a écrit dans le message


de
news: 43f477f0$
> Bonjour à tous
>
> J'ai fais un bout de code sous Access donc en VBA...
>
> Ce code utilises une fonction récursive qui marche très bien, par contre
> elle a 2 arguments :
> - un de type string,
> - et un tableau.
>
> Les 2 évolues en fonction du niveau de récursivité.
>
> Le problème est la lenteur de cette récursivité, pour éventuellement
> accélérer tout ça, j'ai retranscrit
> mon code en VB .NET sous visual studio .net...
>
> A mon grand désespoir, la récursivité pour l'argument de type string
> fonctionne mais pas celle pour l'argument tableau, celui-ci ne garde par
> ses
> valeurs en fonction du son niveau de récursivité ???
>
> Ma question est donc peut-on faire sous VB .NET une fonction récursive
> avec
> un
> argument tableau où est-ce impossible ???
>
> Merci à tous de vos lumière.
>
> @+
> Jessy Sempere - Access MVP
>
> ------------------------------------
> Site @ccess : http://access.jessy.free.fr/
> Pour l'efficacité de tous :
> http://www.mpfa.info/
> ------------------------------------
>
>
>




Avatar
Patrice
Difficile à dire sans voir le code. Le problème est peut-être qu'un tableau
est un objet donc un simple pointeur. Que le pointeur soit passé par
référence ou par valeur, il pointe de toute façon sur les données originales
ce qui annihile la récursivité.

Peut-être un tableau de tableaux, l'un des arguments de dimension étant le
niveau de récursivité.

Il est peut être possible aussi de revoir l'algo. Le fond du problème est
veux tu vraiment que chaque niveau de récursivité ait son propre tableau ?
Cela impliequerait de copier les données à chaque niveau de qui peut
peut-être être évité (par exemple avec une pile).


--
Patrice

"Jessy Sempere [MVP]" a écrit dans le message de
news:43f48aaf$
Re,

Merci pour ta réponse...
En fait je pense savoir d'où viens le problème, en VBA, les arguments


passer
dans une fonction sont passer par défaut par référence, surtout un


argument
tableau qui ne peut pas être passé par valeur...
Visiblement, sous VB.NET, cette contrainte n'éxiste pas lorsque j'ai
retranscri mon code VBA sous VB.NET, il m'a mis pour tous mes arguments
ByVal y compris pour mon argument tableau...

Je ne peux pas tester au boulot mais je testerais ce soir pour vérifier ma
théorie ???

Sinon, en terme de rapidité, est ce qu'après compilation de mon code si il
fonctionne j'aurais les même performances que si je faisais plus ou moins


le
même code sous C ???

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://www.mpfa.info/
------------------------------------
"TroXsA" a écrit dans le message de
news:dt1u5u$nab$
> Bonjour,
>
> Voilà un exemple de récursivité avec tableau ArrayList
>



http://www.troxsa.info/index.php?option=com_content&task=view&id&Itemid=2
>
> je sais pas si c'est bien ça que vous cherchiez ! mais bon ça peut aidé


!
>
> Cordialement
>
> --
>
> Mail : http://cerbermail.com/?rIXgaw9Xsl
> Site : http://troxsa.info
>
>
> "Jessy Sempere [MVP]" a écrit dans le


message
de
> news: 43f477f0$
> > Bonjour à tous
> >
> > J'ai fais un bout de code sous Access donc en VBA...
> >
> > Ce code utilises une fonction récursive qui marche très bien, par


contre
> > elle a 2 arguments :
> > - un de type string,
> > - et un tableau.
> >
> > Les 2 évolues en fonction du niveau de récursivité.
> >
> > Le problème est la lenteur de cette récursivité, pour éventuellement
> > accélérer tout ça, j'ai retranscrit
> > mon code en VB .NET sous visual studio .net...
> >
> > A mon grand désespoir, la récursivité pour l'argument de type string
> > fonctionne mais pas celle pour l'argument tableau, celui-ci ne garde


par
> > ses
> > valeurs en fonction du son niveau de récursivité ???
> >
> > Ma question est donc peut-on faire sous VB .NET une fonction récursive
> > avec
> > un
> > argument tableau où est-ce impossible ???
> >
> > Merci à tous de vos lumière.
> >
> > @+
> > Jessy Sempere - Access MVP
> >
> > ------------------------------------
> > Site @ccess : http://access.jessy.free.fr/
> > Pour l'efficacité de tous :
> > http://www.mpfa.info/
> > ------------------------------------
> >
> >
> >
>
>




Avatar
Jessy Sempere [MVP]
Bonjour

Bon, ça ne fonctionne pas même en mettant byRef...

Sinon voilà le complément d'information que j'avais mis dans le newsgroupe
sur VB6 :

Sinon, je n'ai pas le code que j'ai adapter chez moi pour VB .NET, par
contre j'ai mon code VBA, je vais le réduire un maximum pour aller à
l'essentiel et montrer son fonctionnement :
Le but, c'est de comparer une matrice et de voir quelle combinaison peuvent
se couvrir mutuellement, exemple d'une matrice à comparer :

1 2 3 4 5 6 7 8 9 10 11 12
----------------------------------------------------------
1 1 1 1 0 1 0 1 0 0 0 0 0
2 1 1 0 1 0 1 0 1 0 0 0 0
3 1 0 1 1 1 0 0 0 1 0 0 0
4 0 1 1 1 0 1 0 0 0 1 0 0
5 1 0 1 0 1 1 0 0 0 0 1 0
6 0 1 0 1 1 1 0 0 0 0 0 1
7 1 0 0 0 0 0 1 1 1 0 1 0
8 0 1 0 0 0 0 1 1 0 1 0 1
9 0 0 1 0 0 0 1 0 1 1 1 0
10 0 0 0 1 0 0 0 1 1 1 0 1
11 0 0 0 0 1 0 1 0 1 0 1 1
12 0 0 0 0 0 1 0 1 0 1 1 1

Donc cette matrice sera déclarée en globale dans le code, le but de la
fonction, c'est de combiner la colonne 1 avec la 2 et de vérifier que la
somme de chaque ligne soit différente de 0, si on a 0, on combine alor la 1
avec la 3, ensuite la 1 avec la 4... ensuite, 2 et 3, 2 et 4, ...
Si on a rien, on va descendre d'un niveau et combiner la 1 et 2 avec la 3,
la 1 et 2 avec la 4,... , 1 et 3 avec la 4, 1 et 3 avec la 5, ...

Bon, pour chaque matrice par contre, je déterminer dès le départ le nombre
de combinaison minimum, ici, c'est 3, et pour ce cas les solutions sont :
1;3;12 ou 1;5;10 ou 1;10;12 ou 2;4;11 ou 2;6;9 ou 2;9;11 ou 3;5;8 ou 3;8;12
ou 4;6;7 ou 4;7;11 ou 5;8;10 ou 6;7;9

Voici donc à la grosse ce que fais la fonction récursive sous VBA et elle
fonctionne. Mais, bon, pour ce cas, c'est très rapide mais quand elle fait
200 par 200 avec comme combinaison mimimum, 23 niveau de regroupement, là,
ça ne plante pas, mais c'est très long... D'où, le faire sur un autre
language ???

Voici le code VBA (pas complet) mais qui ne marche pas après conversion sous
VB .NET :

'Déclaration de variables globales :
Dim lngCombi as long 'nombre de niveaux de récursivité
dim tabResult() as integer 'tableaux de comparaison (matrice de l'exemple
supérieur)
dim tabSolution() as string
dim lngSolution as long
dim lngAllGrille as long

function lancement()
lngcombi = 3
lngallgrille
tabresult() = matrice de l'exemple
redim tabcombi(1 to lngallgrille) 'tableau avec une dimension avec que des 0
frecursive_combinaison 1,1,"", tabcombi

end function

Function fRecursive_Combinaison(x, ind, strCombi As String, tabCombi() As
Integer)
'** Fonction récursive pour les combinaisons
Dim lngResult As Long
Dim tabCombi_tmp() As Integer
Dim strCombi_tmp As String

tabCombi_tmp = tabCombi
strCombi_tmp = strCombi

For b = x To lngAllGrille
lngResult = 0
If strCombi_tmp = "" Then
strCombi = b
Else
strCombi = strCombi_tmp & ";" & b
End If

If ind < lngCombi Then
For c = 1 To lngAllGrille
If tabCombi_tmp(c) + tabResult(b, c) = 0 Then
tabCombi(c) = 0
Else
tabCombi(c) = 1
End If
Next
fRecursive_Combinaison b + 1, ind + 1, strCombi, tabCombi
Else
'** resultat
For c = 1 To lngAllGrille
If tabCombi_tmp(c) + tabResult(b, c) <> 0 Then
lngResult = lngResult + 1
Else
Exit For
End If
Next
If lngResult = lngAllGrille Then
'** Chargement d'une solution dans le tableau tabSolution
lngSolution = lngSolution + 1
ReDim Preserve tabSolution(1 To lngSolution)
tabSolution(lngSolution) = strCombi
End If
End If
Next

End Function


--
@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://www.mpfa.info/
------------------------------------
"Patrice" a écrit dans le message de
news:
Difficile à dire sans voir le code. Le problème est peut-être qu'un


tableau
est un objet donc un simple pointeur. Que le pointeur soit passé par
référence ou par valeur, il pointe de toute façon sur les données


originales
ce qui annihile la récursivité.

Peut-être un tableau de tableaux, l'un des arguments de dimension étant le
niveau de récursivité.

Il est peut être possible aussi de revoir l'algo. Le fond du problème est
veux tu vraiment que chaque niveau de récursivité ait son propre tableau ?
Cela impliequerait de copier les données à chaque niveau de qui peut
peut-être être évité (par exemple avec une pile).


--
Patrice

"Jessy Sempere [MVP]" a écrit dans le message


de
news:43f48aaf$
> Re,
>
> Merci pour ta réponse...
> En fait je pense savoir d'où viens le problème, en VBA, les arguments
passer
> dans une fonction sont passer par défaut par référence, surtout un
argument
> tableau qui ne peut pas être passé par valeur...
> Visiblement, sous VB.NET, cette contrainte n'éxiste pas lorsque j'ai
> retranscri mon code VBA sous VB.NET, il m'a mis pour tous mes arguments
> ByVal y compris pour mon argument tableau...
>
> Je ne peux pas tester au boulot mais je testerais ce soir pour vérifier


ma
> théorie ???
>
> Sinon, en terme de rapidité, est ce qu'après compilation de mon code si


il
> fonctionne j'aurais les même performances que si je faisais plus ou


moins
le
> même code sous C ???
>
> @+
> Jessy Sempere - Access MVP
>
> ------------------------------------
> Site @ccess : http://access.jessy.free.fr/
> Pour l'efficacité de tous :
> http://www.mpfa.info/
> ------------------------------------
> "TroXsA" a écrit dans le message de
> news:dt1u5u$nab$
> > Bonjour,
> >
> > Voilà un exemple de récursivité avec tableau ArrayList
> >
>



http://www.troxsa.info/index.php?option=com_content&task=view&id&Itemid=2
> >
> > je sais pas si c'est bien ça que vous cherchiez ! mais bon ça peut


aidé
!
> >
> > Cordialement
> >
> > --
> >
> > Mail : http://cerbermail.com/?rIXgaw9Xsl
> > Site : http://troxsa.info
> >
> >
> > "Jessy Sempere [MVP]" a écrit dans le
message
> de
> > news: 43f477f0$
> > > Bonjour à tous
> > >
> > > J'ai fais un bout de code sous Access donc en VBA...
> > >
> > > Ce code utilises une fonction récursive qui marche très bien, par
contre
> > > elle a 2 arguments :
> > > - un de type string,
> > > - et un tableau.
> > >
> > > Les 2 évolues en fonction du niveau de récursivité.
> > >
> > > Le problème est la lenteur de cette récursivité, pour éventuellement
> > > accélérer tout ça, j'ai retranscrit
> > > mon code en VB .NET sous visual studio .net...
> > >
> > > A mon grand désespoir, la récursivité pour l'argument de type string
> > > fonctionne mais pas celle pour l'argument tableau, celui-ci ne garde
par
> > > ses
> > > valeurs en fonction du son niveau de récursivité ???
> > >
> > > Ma question est donc peut-on faire sous VB .NET une fonction


récursive
> > > avec
> > > un
> > > argument tableau où est-ce impossible ???
> > >
> > > Merci à tous de vos lumière.
> > >
> > > @+
> > > Jessy Sempere - Access MVP
> > >
> > > ------------------------------------
> > > Site @ccess : http://access.jessy.free.fr/
> > > Pour l'efficacité de tous :
> > > http://www.mpfa.info/
> > > ------------------------------------
> > >
> > >
> > >
> >
> >
>
>




Avatar
Patrice
A priori je pense que c'est parce que les tableaux sont des zones mémoires
dans VBA (ou autres languages) mais des objets (donc des pointeurs) en .NET
comme expliqué précédemment.
Je pense qu'il faut que tu copies explicitement le tableau (de mémoire, il
doit y avoir une méthode Copy qui permet de copier un tableau) avant de
passer la copie au niveau suivant...

Tu peux peut-être commencer par faire une maquette avec un tableau 2x2 qui
remplit les cellules avec le niveau de récursivté et imprime le tableau pour
vérifier séparemment ce mécanisme avant de le mettre en oeuvre dans ton
algo.

Je ne suis pas sûr de bien comprendre le principe (la somme est
nécessairement différente de 0 à partir ou tu as au moins un 1 dans chaque
ligne ?). Je ne suis pas sûr non plus que la récursivité soit la meilleure
solution (je pense par exemple qu'il serait sans doute possible de résoudre
le problème en calculant les solutions plutôt que par la force brute).

--
Patrice

"Jessy Sempere [MVP]" a écrit dans le message de
news:43f5783f$
Bonjour

Bon, ça ne fonctionne pas même en mettant byRef...

Sinon voilà le complément d'information que j'avais mis dans le newsgroupe
sur VB6 :

Sinon, je n'ai pas le code que j'ai adapter chez moi pour VB .NET, par
contre j'ai mon code VBA, je vais le réduire un maximum pour aller à
l'essentiel et montrer son fonctionnement :
Le but, c'est de comparer une matrice et de voir quelle combinaison


peuvent
se couvrir mutuellement, exemple d'une matrice à comparer :

1 2 3 4 5 6 7 8 9 10 11 12
----------------------------------------------------------
1 1 1 1 0 1 0 1 0 0 0 0 0
2 1 1 0 1 0 1 0 1 0 0 0 0
3 1 0 1 1 1 0 0 0 1 0 0 0
4 0 1 1 1 0 1 0 0 0 1 0 0
5 1 0 1 0 1 1 0 0 0 0 1 0
6 0 1 0 1 1 1 0 0 0 0 0 1
7 1 0 0 0 0 0 1 1 1 0 1 0
8 0 1 0 0 0 0 1 1 0 1 0 1
9 0 0 1 0 0 0 1 0 1 1 1 0
10 0 0 0 1 0 0 0 1 1 1 0 1
11 0 0 0 0 1 0 1 0 1 0 1 1
12 0 0 0 0 0 1 0 1 0 1 1 1

Donc cette matrice sera déclarée en globale dans le code, le but de la
fonction, c'est de combiner la colonne 1 avec la 2 et de vérifier que la
somme de chaque ligne soit différente de 0, si on a 0, on combine alor la


1
avec la 3, ensuite la 1 avec la 4... ensuite, 2 et 3, 2 et 4, ...
Si on a rien, on va descendre d'un niveau et combiner la 1 et 2 avec la 3,
la 1 et 2 avec la 4,... , 1 et 3 avec la 4, 1 et 3 avec la 5, ...

Bon, pour chaque matrice par contre, je déterminer dès le départ le nombre
de combinaison minimum, ici, c'est 3, et pour ce cas les solutions sont :
1;3;12 ou 1;5;10 ou 1;10;12 ou 2;4;11 ou 2;6;9 ou 2;9;11 ou 3;5;8 ou


3;8;12
ou 4;6;7 ou 4;7;11 ou 5;8;10 ou 6;7;9

Voici donc à la grosse ce que fais la fonction récursive sous VBA et elle
fonctionne. Mais, bon, pour ce cas, c'est très rapide mais quand elle fait
200 par 200 avec comme combinaison mimimum, 23 niveau de regroupement, là,
ça ne plante pas, mais c'est très long... D'où, le faire sur un autre
language ???

Voici le code VBA (pas complet) mais qui ne marche pas après conversion


sous
VB .NET :

'Déclaration de variables globales :
Dim lngCombi as long 'nombre de niveaux de récursivité
dim tabResult() as integer 'tableaux de comparaison (matrice de l'exemple
supérieur)
dim tabSolution() as string
dim lngSolution as long
dim lngAllGrille as long

function lancement()
lngcombi = 3
lngallgrille
tabresult() = matrice de l'exemple
redim tabcombi(1 to lngallgrille) 'tableau avec une dimension avec que des


0
frecursive_combinaison 1,1,"", tabcombi

end function

Function fRecursive_Combinaison(x, ind, strCombi As String, tabCombi() As
Integer)
'** Fonction récursive pour les combinaisons
Dim lngResult As Long
Dim tabCombi_tmp() As Integer
Dim strCombi_tmp As String

tabCombi_tmp = tabCombi
strCombi_tmp = strCombi

For b = x To lngAllGrille
lngResult = 0
If strCombi_tmp = "" Then
strCombi = b
Else
strCombi = strCombi_tmp & ";" & b
End If

If ind < lngCombi Then
For c = 1 To lngAllGrille
If tabCombi_tmp(c) + tabResult(b, c) = 0 Then
tabCombi(c) = 0
Else
tabCombi(c) = 1
End If
Next
fRecursive_Combinaison b + 1, ind + 1, strCombi, tabCombi
Else
'** resultat
For c = 1 To lngAllGrille
If tabCombi_tmp(c) + tabResult(b, c) <> 0 Then
lngResult = lngResult + 1
Else
Exit For
End If
Next
If lngResult = lngAllGrille Then
'** Chargement d'une solution dans le tableau tabSolution
lngSolution = lngSolution + 1
ReDim Preserve tabSolution(1 To lngSolution)
tabSolution(lngSolution) = strCombi
End If
End If
Next

End Function


--
@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://www.mpfa.info/
------------------------------------
"Patrice" a écrit dans le message de
news:
> Difficile à dire sans voir le code. Le problème est peut-être qu'un
tableau
> est un objet donc un simple pointeur. Que le pointeur soit passé par
> référence ou par valeur, il pointe de toute façon sur les données
originales
> ce qui annihile la récursivité.
>
> Peut-être un tableau de tableaux, l'un des arguments de dimension étant


le
> niveau de récursivité.
>
> Il est peut être possible aussi de revoir l'algo. Le fond du problème


est
> veux tu vraiment que chaque niveau de récursivité ait son propre tableau


?
> Cela impliequerait de copier les données à chaque niveau de qui peut
> peut-être être évité (par exemple avec une pile).
>
>
> --
> Patrice
>
> "Jessy Sempere [MVP]" a écrit dans le


message
de
> news:43f48aaf$
> > Re,
> >
> > Merci pour ta réponse...
> > En fait je pense savoir d'où viens le problème, en VBA, les arguments
> passer
> > dans une fonction sont passer par défaut par référence, surtout un
> argument
> > tableau qui ne peut pas être passé par valeur...
> > Visiblement, sous VB.NET, cette contrainte n'éxiste pas lorsque j'ai
> > retranscri mon code VBA sous VB.NET, il m'a mis pour tous mes


arguments
> > ByVal y compris pour mon argument tableau...
> >
> > Je ne peux pas tester au boulot mais je testerais ce soir pour


vérifier
ma
> > théorie ???
> >
> > Sinon, en terme de rapidité, est ce qu'après compilation de mon code


si
il
> > fonctionne j'aurais les même performances que si je faisais plus ou
moins
> le
> > même code sous C ???
> >
> > @+
> > Jessy Sempere - Access MVP
> >
> > ------------------------------------
> > Site @ccess : http://access.jessy.free.fr/
> > Pour l'efficacité de tous :
> > http://www.mpfa.info/
> > ------------------------------------
> > "TroXsA" a écrit dans le message de
> > news:dt1u5u$nab$
> > > Bonjour,
> > >
> > > Voilà un exemple de récursivité avec tableau ArrayList
> > >
> >
>



http://www.troxsa.info/index.php?option=com_content&task=view&id&Itemid=2
> > >
> > > je sais pas si c'est bien ça que vous cherchiez ! mais bon ça peut
aidé
> !
> > >
> > > Cordialement
> > >
> > > --
> > >
> > > Mail : http://cerbermail.com/?rIXgaw9Xsl
> > > Site : http://troxsa.info
> > >
> > >
> > > "Jessy Sempere [MVP]" a écrit dans le
> message
> > de
> > > news: 43f477f0$
> > > > Bonjour à tous
> > > >
> > > > J'ai fais un bout de code sous Access donc en VBA...
> > > >
> > > > Ce code utilises une fonction récursive qui marche très bien, par
> contre
> > > > elle a 2 arguments :
> > > > - un de type string,
> > > > - et un tableau.
> > > >
> > > > Les 2 évolues en fonction du niveau de récursivité.
> > > >
> > > > Le problème est la lenteur de cette récursivité, pour


éventuellement
> > > > accélérer tout ça, j'ai retranscrit
> > > > mon code en VB .NET sous visual studio .net...
> > > >
> > > > A mon grand désespoir, la récursivité pour l'argument de type


string
> > > > fonctionne mais pas celle pour l'argument tableau, celui-ci ne


garde
> par
> > > > ses
> > > > valeurs en fonction du son niveau de récursivité ???
> > > >
> > > > Ma question est donc peut-on faire sous VB .NET une fonction
récursive
> > > > avec
> > > > un
> > > > argument tableau où est-ce impossible ???
> > > >
> > > > Merci à tous de vos lumière.
> > > >
> > > > @+
> > > > Jessy Sempere - Access MVP
> > > >
> > > > ------------------------------------
> > > > Site @ccess : http://access.jessy.free.fr/
> > > > Pour l'efficacité de tous :
> > > > http://www.mpfa.info/
> > > > ------------------------------------
> > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>




Avatar
Jessy Sempere [MVP]
Re
"Patrice" a écrit :

A priori je pense que c'est parce que les tableaux sont des zones mémoires
dans VBA (ou autres languages) mais des objets (donc des pointeurs) en


.NET
comme expliqué précédemment.
Je pense qu'il faut que tu copies explicitement le tableau (de mémoire, il
doit y avoir une méthode Copy qui permet de copier un tableau) avant de
passer la copie au niveau suivant...



Tout d'abord, merci de t'interesser à mon problème... ;-)
Si tu regardes le code en exemple, c'est bien ce que je fais, dès que je
rentre dans ma fonction récursive, je mets le tableau tabCombi() dans le
tableau temporaire tabCombi_TMP()

Tu peux peut-être commencer par faire une maquette avec un tableau 2x2 qui
remplit les cellules avec le niveau de récursivté et imprime le tableau


pour
vérifier séparemment ce mécanisme avant de le mettre en oeuvre dans ton
algo.

Je ne suis pas sûr de bien comprendre le principe (la somme est
nécessairement différente de 0 à partir ou tu as au moins un 1 dans chaque
ligne ?). Je ne suis pas sûr non plus que la récursivité soit la meilleure
solution (je pense par exemple qu'il serait sans doute possible de


résoudre
le problème en calculant les solutions plutôt que par la force brute).



En fait si tu regardes mon exemple, tu vois que si tu combines la colonnes
1, la 2 et la 3, tu n'obtiendras pas 1 pour chaque ligne, et c'est justement
ce que cherche ma fonction récursive, trouver quelles combinaisons de
colonnes permet d'avoir 1 sur chaque ligne ???
(sous VBA ça fonctionne mais pas sous VB .NET)

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://www.mpfa.info/
------------------------------------

"Jessy Sempere [MVP]" a écrit dans le message


de
news:43f5783f$
> Bonjour
>
> Bon, ça ne fonctionne pas même en mettant byRef...
>
> Sinon voilà le complément d'information que j'avais mis dans le


newsgroupe
> sur VB6 :
>
> Sinon, je n'ai pas le code que j'ai adapter chez moi pour VB .NET, par
> contre j'ai mon code VBA, je vais le réduire un maximum pour aller à
> l'essentiel et montrer son fonctionnement :
> Le but, c'est de comparer une matrice et de voir quelle combinaison
peuvent
> se couvrir mutuellement, exemple d'une matrice à comparer :
>
> 1 2 3 4 5 6 7 8 9 10 11 12
> ----------------------------------------------------------
> 1 1 1 1 0 1 0 1 0 0 0 0 0
> 2 1 1 0 1 0 1 0 1 0 0 0 0
> 3 1 0 1 1 1 0 0 0 1 0 0 0
> 4 0 1 1 1 0 1 0 0 0 1 0 0
> 5 1 0 1 0 1 1 0 0 0 0 1 0
> 6 0 1 0 1 1 1 0 0 0 0 0 1
> 7 1 0 0 0 0 0 1 1 1 0 1 0
> 8 0 1 0 0 0 0 1 1 0 1 0 1
> 9 0 0 1 0 0 0 1 0 1 1 1 0
> 10 0 0 0 1 0 0 0 1 1 1 0 1
> 11 0 0 0 0 1 0 1 0 1 0 1 1
> 12 0 0 0 0 0 1 0 1 0 1 1 1
>
> Donc cette matrice sera déclarée en globale dans le code, le but de la
> fonction, c'est de combiner la colonne 1 avec la 2 et de vérifier que la
> somme de chaque ligne soit différente de 0, si on a 0, on combine alor


la
1
> avec la 3, ensuite la 1 avec la 4... ensuite, 2 et 3, 2 et 4, ...
> Si on a rien, on va descendre d'un niveau et combiner la 1 et 2 avec la


3,
> la 1 et 2 avec la 4,... , 1 et 3 avec la 4, 1 et 3 avec la 5, ...
>
> Bon, pour chaque matrice par contre, je déterminer dès le départ le


nombre
> de combinaison minimum, ici, c'est 3, et pour ce cas les solutions sont


:
> 1;3;12 ou 1;5;10 ou 1;10;12 ou 2;4;11 ou 2;6;9 ou 2;9;11 ou 3;5;8 ou
3;8;12
> ou 4;6;7 ou 4;7;11 ou 5;8;10 ou 6;7;9
>
> Voici donc à la grosse ce que fais la fonction récursive sous VBA et


elle
> fonctionne. Mais, bon, pour ce cas, c'est très rapide mais quand elle


fait
> 200 par 200 avec comme combinaison mimimum, 23 niveau de regroupement,


là,
> ça ne plante pas, mais c'est très long... D'où, le faire sur un autre
> language ???
>
> Voici le code VBA (pas complet) mais qui ne marche pas après conversion
sous
> VB .NET :
>
> 'Déclaration de variables globales :
> Dim lngCombi as long 'nombre de niveaux de récursivité
> dim tabResult() as integer 'tableaux de comparaison (matrice de


l'exemple
> supérieur)
> dim tabSolution() as string
> dim lngSolution as long
> dim lngAllGrille as long
>
> function lancement()
> lngcombi = 3
> lngallgrille
> tabresult() = matrice de l'exemple
> redim tabcombi(1 to lngallgrille) 'tableau avec une dimension avec que


des
0
> frecursive_combinaison 1,1,"", tabcombi
>
> end function
>
> Function fRecursive_Combinaison(x, ind, strCombi As String, tabCombi()


As
> Integer)
> '** Fonction récursive pour les combinaisons
> Dim lngResult As Long
> Dim tabCombi_tmp() As Integer
> Dim strCombi_tmp As String
>
> tabCombi_tmp = tabCombi
> strCombi_tmp = strCombi
>
> For b = x To lngAllGrille
> lngResult = 0
> If strCombi_tmp = "" Then
> strCombi = b
> Else
> strCombi = strCombi_tmp & ";" & b
> End If
>
> If ind < lngCombi Then
> For c = 1 To lngAllGrille
> If tabCombi_tmp(c) + tabResult(b, c) = 0 Then
> tabCombi(c) = 0
> Else
> tabCombi(c) = 1
> End If
> Next
> fRecursive_Combinaison b + 1, ind + 1, strCombi, tabCombi
> Else
> '** resultat
> For c = 1 To lngAllGrille
> If tabCombi_tmp(c) + tabResult(b, c) <> 0 Then
> lngResult = lngResult + 1
> Else
> Exit For
> End If
> Next
> If lngResult = lngAllGrille Then
> '** Chargement d'une solution dans le tableau tabSolution
> lngSolution = lngSolution + 1
> ReDim Preserve tabSolution(1 To lngSolution)
> tabSolution(lngSolution) = strCombi
> End If
> End If
> Next
>
> End Function
>
>
> --
> @+
> Jessy Sempere - Access MVP
>
> ------------------------------------
> Site @ccess : http://access.jessy.free.fr/
> Pour l'efficacité de tous :
> http://www.mpfa.info/
> ------------------------------------
> "Patrice" a écrit dans le message de
> news:
> > Difficile à dire sans voir le code. Le problème est peut-être qu'un
> tableau
> > est un objet donc un simple pointeur. Que le pointeur soit passé par
> > référence ou par valeur, il pointe de toute façon sur les données
> originales
> > ce qui annihile la récursivité.
> >
> > Peut-être un tableau de tableaux, l'un des arguments de dimension


étant
le
> > niveau de récursivité.
> >
> > Il est peut être possible aussi de revoir l'algo. Le fond du problème
est
> > veux tu vraiment que chaque niveau de récursivité ait son propre


tableau
?
> > Cela impliequerait de copier les données à chaque niveau de qui peut
> > peut-être être évité (par exemple avec une pile).
> >
> >
> > --
> > Patrice
> >
> > "Jessy Sempere [MVP]" a écrit dans le
message
> de
> > news:43f48aaf$
> > > Re,
> > >
> > > Merci pour ta réponse...
> > > En fait je pense savoir d'où viens le problème, en VBA, les


arguments
> > passer
> > > dans une fonction sont passer par défaut par référence, surtout un
> > argument
> > > tableau qui ne peut pas être passé par valeur...
> > > Visiblement, sous VB.NET, cette contrainte n'éxiste pas lorsque j'ai
> > > retranscri mon code VBA sous VB.NET, il m'a mis pour tous mes
arguments
> > > ByVal y compris pour mon argument tableau...
> > >
> > > Je ne peux pas tester au boulot mais je testerais ce soir pour
vérifier
> ma
> > > théorie ???
> > >
> > > Sinon, en terme de rapidité, est ce qu'après compilation de mon code
si
> il
> > > fonctionne j'aurais les même performances que si je faisais plus ou
> moins
> > le
> > > même code sous C ???
> > >
> > > @+
> > > Jessy Sempere - Access MVP
> > >
> > > ------------------------------------
> > > Site @ccess : http://access.jessy.free.fr/
> > > Pour l'efficacité de tous :
> > > http://www.mpfa.info/
> > > ------------------------------------
> > > "TroXsA" a écrit dans le message de
> > > news:dt1u5u$nab$
> > > > Bonjour,
> > > >
> > > > Voilà un exemple de récursivité avec tableau ArrayList
> > > >
> > >
> >
>



http://www.troxsa.info/index.php?option=com_content&task=view&id&Itemid=2
> > > >
> > > > je sais pas si c'est bien ça que vous cherchiez ! mais bon ça peut
> aidé
> > !
> > > >
> > > > Cordialement
> > > >
> > > > --
> > > >
> > > > Mail : http://cerbermail.com/?rIXgaw9Xsl
> > > > Site : http://troxsa.info
> > > >
> > > >
> > > > "Jessy Sempere [MVP]" a écrit dans le
> > message
> > > de
> > > > news: 43f477f0$
> > > > > Bonjour à tous
> > > > >
> > > > > J'ai fais un bout de code sous Access donc en VBA...
> > > > >
> > > > > Ce code utilises une fonction récursive qui marche très bien,


par
> > contre
> > > > > elle a 2 arguments :
> > > > > - un de type string,
> > > > > - et un tableau.
> > > > >
> > > > > Les 2 évolues en fonction du niveau de récursivité.
> > > > >
> > > > > Le problème est la lenteur de cette récursivité, pour
éventuellement
> > > > > accélérer tout ça, j'ai retranscrit
> > > > > mon code en VB .NET sous visual studio .net...
> > > > >
> > > > > A mon grand désespoir, la récursivité pour l'argument de type
string
> > > > > fonctionne mais pas celle pour l'argument tableau, celui-ci ne
garde
> > par
> > > > > ses
> > > > > valeurs en fonction du son niveau de récursivité ???
> > > > >
> > > > > Ma question est donc peut-on faire sous VB .NET une fonction
> récursive
> > > > > avec
> > > > > un
> > > > > argument tableau où est-ce impossible ???
> > > > >
> > > > > Merci à tous de vos lumière.
> > > > >
> > > > > @+
> > > > > Jessy Sempere - Access MVP
> > > > >
> > > > > ------------------------------------
> > > > > Site @ccess : http://access.jessy.free.fr/
> > > > > Pour l'efficacité de tous :
> > > > > http://www.mpfa.info/
> > > > > ------------------------------------
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>




Avatar
Patrice
Je disais donc qu'en .NET les tableaux sont des *objets* :
Dim a(0) As Integer
Dim b(0) As Integer
a(0) = 1
b = a ' b et a "pointent" sur le *même* tableau
b(0) = 2
MsgBox(a(0))
Exit Sub

Affiche 2

Dim a(0) As Integer
Dim b(0) As Integer
a(0) = 1
Array.Copy(a, b, a.Length) ' b et a sont des tableaux différents
b(0) = 2
MsgBox(a(0))
Exit Sub

Affiche 1

Attention aussi à passer le tableau temporaire et non le tableau original
dans l'appel récursif...

Pour le reste je n'ai pas compris le problème. Je crois comprendre
maintenant que tu veux fusionner des "lignes" (et non pas des colonnes ?) de
telle façon que chaque colonne de ces lignes comporte au moins un "1" ? (et
non pas que la somme de la ligne soit égale à zéro ?). Cela correspond à un
casse tête réel, un défi de programmation, un cas d'école ou quoi ?

Si c'est bien le principe, il suffirait de calculer pour chaque ligne le
nombre binaire correspondant. Les solutions sont les lignes dont l'addition
binaire donne des 1 partout (par exemple 256 avec 8 colonnes). Voir par
exemple la classe BitVector...

En éliminant les doublons (la ligne 1 et la ligne 3 donnent le même résultat
que la ligne 3 et la ligne 1, les lignes qui ne font pas avancer la solution
car elles n'apportent pas de nouveaux 1, en favorisant les lignes ayant le
plus grand nombre de 1 ce qui devrait permettre d'atteindre le but plus
rapidement) etc, il devrait être possible de produire une liste de résultats
plus rapidement (voire même peut-être exhaustive ?)

Quelque part ce n'est qu'une "simple" résolution d'équation...

Bon courage.

--

Patrice




"Jessy Sempere [MVP]" a écrit dans le message de
news:43f5900b$

Re
"Patrice" a écrit :

> A priori je pense que c'est parce que les tableaux sont des zones


mémoires
> dans VBA (ou autres languages) mais des objets (donc des pointeurs) en
.NET
> comme expliqué précédemment.
> Je pense qu'il faut que tu copies explicitement le tableau (de mémoire,


il
> doit y avoir une méthode Copy qui permet de copier un tableau) avant de
> passer la copie au niveau suivant...

Tout d'abord, merci de t'interesser à mon problème... ;-)
Si tu regardes le code en exemple, c'est bien ce que je fais, dès que je
rentre dans ma fonction récursive, je mets le tableau tabCombi() dans le
tableau temporaire tabCombi_TMP()

> Tu peux peut-être commencer par faire une maquette avec un tableau 2x2


qui
> remplit les cellules avec le niveau de récursivté et imprime le tableau
pour
> vérifier séparemment ce mécanisme avant de le mettre en oeuvre dans ton
> algo.
>
> Je ne suis pas sûr de bien comprendre le principe (la somme est
> nécessairement différente de 0 à partir ou tu as au moins un 1 dans


chaque
> ligne ?). Je ne suis pas sûr non plus que la récursivité soit la


meilleure
> solution (je pense par exemple qu'il serait sans doute possible de
résoudre
> le problème en calculant les solutions plutôt que par la force brute).

En fait si tu regardes mon exemple, tu vois que si tu combines la colonnes
1, la 2 et la 3, tu n'obtiendras pas 1 pour chaque ligne, et c'est


justement
ce que cherche ma fonction récursive, trouver quelles combinaisons de
colonnes permet d'avoir 1 sur chaque ligne ???
(sous VBA ça fonctionne mais pas sous VB .NET)

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://www.mpfa.info/
------------------------------------
>
> "Jessy Sempere [MVP]" a écrit dans le


message
de
> news:43f5783f$
> > Bonjour
> >
> > Bon, ça ne fonctionne pas même en mettant byRef...
> >
> > Sinon voilà le complément d'information que j'avais mis dans le
newsgroupe
> > sur VB6 :
> >
> > Sinon, je n'ai pas le code que j'ai adapter chez moi pour VB .NET, par
> > contre j'ai mon code VBA, je vais le réduire un maximum pour aller à
> > l'essentiel et montrer son fonctionnement :
> > Le but, c'est de comparer une matrice et de voir quelle combinaison
> peuvent
> > se couvrir mutuellement, exemple d'une matrice à comparer :
> >
> > 1 2 3 4 5 6 7 8 9 10 11 12
> > ----------------------------------------------------------
> > 1 1 1 1 0 1 0 1 0 0 0 0 0
> > 2 1 1 0 1 0 1 0 1 0 0 0 0
> > 3 1 0 1 1 1 0 0 0 1 0 0 0
> > 4 0 1 1 1 0 1 0 0 0 1 0 0
> > 5 1 0 1 0 1 1 0 0 0 0 1 0
> > 6 0 1 0 1 1 1 0 0 0 0 0 1
> > 7 1 0 0 0 0 0 1 1 1 0 1 0
> > 8 0 1 0 0 0 0 1 1 0 1 0 1
> > 9 0 0 1 0 0 0 1 0 1 1 1 0
> > 10 0 0 0 1 0 0 0 1 1 1 0 1
> > 11 0 0 0 0 1 0 1 0 1 0 1 1
> > 12 0 0 0 0 0 1 0 1 0 1 1 1
> >
> > Donc cette matrice sera déclarée en globale dans le code, le but de la
> > fonction, c'est de combiner la colonne 1 avec la 2 et de vérifier que


la
> > somme de chaque ligne soit différente de 0, si on a 0, on combine alor
la
> 1
> > avec la 3, ensuite la 1 avec la 4... ensuite, 2 et 3, 2 et 4, ...
> > Si on a rien, on va descendre d'un niveau et combiner la 1 et 2 avec


la
3,
> > la 1 et 2 avec la 4,... , 1 et 3 avec la 4, 1 et 3 avec la 5, ...
> >
> > Bon, pour chaque matrice par contre, je déterminer dès le départ le
nombre
> > de combinaison minimum, ici, c'est 3, et pour ce cas les solutions


sont
:
> > 1;3;12 ou 1;5;10 ou 1;10;12 ou 2;4;11 ou 2;6;9 ou 2;9;11 ou 3;5;8 ou
> 3;8;12
> > ou 4;6;7 ou 4;7;11 ou 5;8;10 ou 6;7;9
> >
> > Voici donc à la grosse ce que fais la fonction récursive sous VBA et
elle
> > fonctionne. Mais, bon, pour ce cas, c'est très rapide mais quand elle
fait
> > 200 par 200 avec comme combinaison mimimum, 23 niveau de regroupement,
là,
> > ça ne plante pas, mais c'est très long... D'où, le faire sur un autre
> > language ???
> >
> > Voici le code VBA (pas complet) mais qui ne marche pas après


conversion
> sous
> > VB .NET :
> >
> > 'Déclaration de variables globales :
> > Dim lngCombi as long 'nombre de niveaux de récursivité
> > dim tabResult() as integer 'tableaux de comparaison (matrice de
l'exemple
> > supérieur)
> > dim tabSolution() as string
> > dim lngSolution as long
> > dim lngAllGrille as long
> >
> > function lancement()
> > lngcombi = 3
> > lngallgrille
> > tabresult() = matrice de l'exemple
> > redim tabcombi(1 to lngallgrille) 'tableau avec une dimension avec que
des
> 0
> > frecursive_combinaison 1,1,"", tabcombi
> >
> > end function
> >
> > Function fRecursive_Combinaison(x, ind, strCombi As String, tabCombi()
As
> > Integer)
> > '** Fonction récursive pour les combinaisons
> > Dim lngResult As Long
> > Dim tabCombi_tmp() As Integer
> > Dim strCombi_tmp As String
> >
> > tabCombi_tmp = tabCombi
> > strCombi_tmp = strCombi
> >
> > For b = x To lngAllGrille
> > lngResult = 0
> > If strCombi_tmp = "" Then
> > strCombi = b
> > Else
> > strCombi = strCombi_tmp & ";" & b
> > End If
> >
> > If ind < lngCombi Then
> > For c = 1 To lngAllGrille
> > If tabCombi_tmp(c) + tabResult(b, c) = 0 Then
> > tabCombi(c) = 0
> > Else
> > tabCombi(c) = 1
> > End If
> > Next
> > fRecursive_Combinaison b + 1, ind + 1, strCombi, tabCombi
> > Else
> > '** resultat
> > For c = 1 To lngAllGrille
> > If tabCombi_tmp(c) + tabResult(b, c) <> 0 Then
> > lngResult = lngResult + 1
> > Else
> > Exit For
> > End If
> > Next
> > If lngResult = lngAllGrille Then
> > '** Chargement d'une solution dans le tableau tabSolution
> > lngSolution = lngSolution + 1
> > ReDim Preserve tabSolution(1 To lngSolution)
> > tabSolution(lngSolution) = strCombi
> > End If
> > End If
> > Next
> >
> > End Function
> >
> >
> > --
> > @+
> > Jessy Sempere - Access MVP
> >
> > ------------------------------------
> > Site @ccess : http://access.jessy.free.fr/
> > Pour l'efficacité de tous :
> > http://www.mpfa.info/
> > ------------------------------------
> > "Patrice" a écrit dans le message de
> > news:
> > > Difficile à dire sans voir le code. Le problème est peut-être qu'un
> > tableau
> > > est un objet donc un simple pointeur. Que le pointeur soit passé par
> > > référence ou par valeur, il pointe de toute façon sur les données
> > originales
> > > ce qui annihile la récursivité.
> > >
> > > Peut-être un tableau de tableaux, l'un des arguments de dimension
étant
> le
> > > niveau de récursivité.
> > >
> > > Il est peut être possible aussi de revoir l'algo. Le fond du


problème
> est
> > > veux tu vraiment que chaque niveau de récursivité ait son propre
tableau
> ?
> > > Cela impliequerait de copier les données à chaque niveau de qui peut
> > > peut-être être évité (par exemple avec une pile).
> > >
> > >
> > > --
> > > Patrice
> > >
> > > "Jessy Sempere [MVP]" a écrit dans le
> message
> > de
> > > news:43f48aaf$
> > > > Re,
> > > >
> > > > Merci pour ta réponse...
> > > > En fait je pense savoir d'où viens le problème, en VBA, les
arguments
> > > passer
> > > > dans une fonction sont passer par défaut par référence, surtout un
> > > argument
> > > > tableau qui ne peut pas être passé par valeur...
> > > > Visiblement, sous VB.NET, cette contrainte n'éxiste pas lorsque


j'ai
> > > > retranscri mon code VBA sous VB.NET, il m'a mis pour tous mes
> arguments
> > > > ByVal y compris pour mon argument tableau...
> > > >
> > > > Je ne peux pas tester au boulot mais je testerais ce soir pour
> vérifier
> > ma
> > > > théorie ???
> > > >
> > > > Sinon, en terme de rapidité, est ce qu'après compilation de mon


code
> si
> > il
> > > > fonctionne j'aurais les même performances que si je faisais plus


ou
> > moins
> > > le
> > > > même code sous C ???
> > > >
> > > > @+
> > > > Jessy Sempere - Access MVP
> > > >
> > > > ------------------------------------
> > > > Site @ccess : http://access.jessy.free.fr/
> > > > Pour l'efficacité de tous :
> > > > http://www.mpfa.info/
> > > > ------------------------------------
> > > > "TroXsA" a écrit dans le message de
> > > > news:dt1u5u$nab$
> > > > > Bonjour,
> > > > >
> > > > > Voilà un exemple de récursivité avec tableau ArrayList
> > > > >
> > > >
> > >
> >
>



http://www.troxsa.info/index.php?option=com_content&task=view&id&Itemid=2
> > > > >
> > > > > je sais pas si c'est bien ça que vous cherchiez ! mais bon ça


peut
> > aidé
> > > !
> > > > >
> > > > > Cordialement
> > > > >
> > > > > --
> > > > >
> > > > > Mail : http://cerbermail.com/?rIXgaw9Xsl
> > > > > Site : http://troxsa.info
> > > > >
> > > > >
> > > > > "Jessy Sempere [MVP]" a écrit dans


le
> > > message
> > > > de
> > > > > news: 43f477f0$
> > > > > > Bonjour à tous
> > > > > >
> > > > > > J'ai fais un bout de code sous Access donc en VBA...
> > > > > >
> > > > > > Ce code utilises une fonction récursive qui marche très bien,
par
> > > contre
> > > > > > elle a 2 arguments :
> > > > > > - un de type string,
> > > > > > - et un tableau.
> > > > > >
> > > > > > Les 2 évolues en fonction du niveau de récursivité.
> > > > > >
> > > > > > Le problème est la lenteur de cette récursivité, pour
> éventuellement
> > > > > > accélérer tout ça, j'ai retranscrit
> > > > > > mon code en VB .NET sous visual studio .net...
> > > > > >
> > > > > > A mon grand désespoir, la récursivité pour l'argument de type
> string
> > > > > > fonctionne mais pas celle pour l'argument tableau, celui-ci ne
> garde
> > > par
> > > > > > ses
> > > > > > valeurs en fonction du son niveau de récursivité ???
> > > > > >
> > > > > > Ma question est donc peut-on faire sous VB .NET une fonction
> > récursive
> > > > > > avec
> > > > > > un
> > > > > > argument tableau où est-ce impossible ???
> > > > > >
> > > > > > Merci à tous de vos lumière.
> > > > > >
> > > > > > @+
> > > > > > Jessy Sempere - Access MVP
> > > > > >
> > > > > > ------------------------------------
> > > > > > Site @ccess : http://access.jessy.free.fr/
> > > > > > Pour l'efficacité de tous :
> > > > > > http://www.mpfa.info/
> > > > > > ------------------------------------
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>




Avatar
Jessy Sempere [MVP]
Re,

En grand merci à toi, j'ai résolu mon problème...
Je mettais :
a = b
hors il fallait bien mettre :
array.copy(...)

Merci à toi

--
@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Patrice" a écrit dans le message de news:

Je disais donc qu'en .NET les tableaux sont des *objets* :
Dim a(0) As Integer
Dim b(0) As Integer
a(0) = 1
b = a ' b et a "pointent" sur le *même* tableau
b(0) = 2
MsgBox(a(0))
Exit Sub

Affiche 2

Dim a(0) As Integer
Dim b(0) As Integer
a(0) = 1
Array.Copy(a, b, a.Length) ' b et a sont des tableaux différents
b(0) = 2
MsgBox(a(0))
Exit Sub

Affiche 1

Attention aussi à passer le tableau temporaire et non le tableau original
dans l'appel récursif...

Pour le reste je n'ai pas compris le problème. Je crois comprendre
maintenant que tu veux fusionner des "lignes" (et non pas des colonnes ?)
de
telle façon que chaque colonne de ces lignes comporte au moins un "1" ?
(et
non pas que la somme de la ligne soit égale à zéro ?). Cela correspond à
un
casse tête réel, un défi de programmation, un cas d'école ou quoi ?

Si c'est bien le principe, il suffirait de calculer pour chaque ligne le
nombre binaire correspondant. Les solutions sont les lignes dont
l'addition
binaire donne des 1 partout (par exemple 256 avec 8 colonnes). Voir par
exemple la classe BitVector...

En éliminant les doublons (la ligne 1 et la ligne 3 donnent le même
résultat
que la ligne 3 et la ligne 1, les lignes qui ne font pas avancer la
solution
car elles n'apportent pas de nouveaux 1, en favorisant les lignes ayant le
plus grand nombre de 1 ce qui devrait permettre d'atteindre le but plus
rapidement) etc, il devrait être possible de produire une liste de
résultats
plus rapidement (voire même peut-être exhaustive ?)

Quelque part ce n'est qu'une "simple" résolution d'équation...

Bon courage.

--

Patrice




"Jessy Sempere [MVP]" a écrit dans le message
de
news:43f5900b$

Re
"Patrice" a écrit :

> A priori je pense que c'est parce que les tableaux sont des zones


mémoires
> dans VBA (ou autres languages) mais des objets (donc des pointeurs) en
.NET
> comme expliqué précédemment.
> Je pense qu'il faut que tu copies explicitement le tableau (de mémoire,


il
> doit y avoir une méthode Copy qui permet de copier un tableau) avant de
> passer la copie au niveau suivant...

Tout d'abord, merci de t'interesser à mon problème... ;-)
Si tu regardes le code en exemple, c'est bien ce que je fais, dès que je
rentre dans ma fonction récursive, je mets le tableau tabCombi() dans le
tableau temporaire tabCombi_TMP()

> Tu peux peut-être commencer par faire une maquette avec un tableau 2x2


qui
> remplit les cellules avec le niveau de récursivté et imprime le tableau
pour
> vérifier séparemment ce mécanisme avant de le mettre en oeuvre dans ton
> algo.
>
> Je ne suis pas sûr de bien comprendre le principe (la somme est
> nécessairement différente de 0 à partir ou tu as au moins un 1 dans


chaque
> ligne ?). Je ne suis pas sûr non plus que la récursivité soit la


meilleure
> solution (je pense par exemple qu'il serait sans doute possible de
résoudre
> le problème en calculant les solutions plutôt que par la force brute).

En fait si tu regardes mon exemple, tu vois que si tu combines la
colonnes
1, la 2 et la 3, tu n'obtiendras pas 1 pour chaque ligne, et c'est


justement
ce que cherche ma fonction récursive, trouver quelles combinaisons de
colonnes permet d'avoir 1 sur chaque ligne ???
(sous VBA ça fonctionne mais pas sous VB .NET)

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://www.mpfa.info/
------------------------------------
>
> "Jessy Sempere [MVP]" a écrit dans le


message
de
> news:43f5783f$
> > Bonjour
> >
> > Bon, ça ne fonctionne pas même en mettant byRef...
> >
> > Sinon voilà le complément d'information que j'avais mis dans le
newsgroupe
> > sur VB6 :
> >
> > Sinon, je n'ai pas le code que j'ai adapter chez moi pour VB .NET,
> > par
> > contre j'ai mon code VBA, je vais le réduire un maximum pour aller à
> > l'essentiel et montrer son fonctionnement :
> > Le but, c'est de comparer une matrice et de voir quelle combinaison
> peuvent
> > se couvrir mutuellement, exemple d'une matrice à comparer :
> >
> > 1 2 3 4 5 6 7 8 9 10 11 12
> > ----------------------------------------------------------
> > 1 1 1 1 0 1 0 1 0 0 0 0 0
> > 2 1 1 0 1 0 1 0 1 0 0 0 0
> > 3 1 0 1 1 1 0 0 0 1 0 0 0
> > 4 0 1 1 1 0 1 0 0 0 1 0 0
> > 5 1 0 1 0 1 1 0 0 0 0 1 0
> > 6 0 1 0 1 1 1 0 0 0 0 0 1
> > 7 1 0 0 0 0 0 1 1 1 0 1 0
> > 8 0 1 0 0 0 0 1 1 0 1 0 1
> > 9 0 0 1 0 0 0 1 0 1 1 1 0
> > 10 0 0 0 1 0 0 0 1 1 1 0 1
> > 11 0 0 0 0 1 0 1 0 1 0 1 1
> > 12 0 0 0 0 0 1 0 1 0 1 1 1
> >
> > Donc cette matrice sera déclarée en globale dans le code, le but de
> > la
> > fonction, c'est de combiner la colonne 1 avec la 2 et de vérifier que


la
> > somme de chaque ligne soit différente de 0, si on a 0, on combine
> > alor
la
> 1
> > avec la 3, ensuite la 1 avec la 4... ensuite, 2 et 3, 2 et 4, ...
> > Si on a rien, on va descendre d'un niveau et combiner la 1 et 2 avec


la
3,
> > la 1 et 2 avec la 4,... , 1 et 3 avec la 4, 1 et 3 avec la 5, ...
> >
> > Bon, pour chaque matrice par contre, je déterminer dès le départ le
nombre
> > de combinaison minimum, ici, c'est 3, et pour ce cas les solutions


sont
:
> > 1;3;12 ou 1;5;10 ou 1;10;12 ou 2;4;11 ou 2;6;9 ou 2;9;11 ou 3;5;8 ou
> 3;8;12
> > ou 4;6;7 ou 4;7;11 ou 5;8;10 ou 6;7;9
> >
> > Voici donc à la grosse ce que fais la fonction récursive sous VBA et
elle
> > fonctionne. Mais, bon, pour ce cas, c'est très rapide mais quand elle
fait
> > 200 par 200 avec comme combinaison mimimum, 23 niveau de
> > regroupement,
là,
> > ça ne plante pas, mais c'est très long... D'où, le faire sur un autre
> > language ???
> >
> > Voici le code VBA (pas complet) mais qui ne marche pas après


conversion
> sous
> > VB .NET :
> >
> > 'Déclaration de variables globales :
> > Dim lngCombi as long 'nombre de niveaux de récursivité
> > dim tabResult() as integer 'tableaux de comparaison (matrice de
l'exemple
> > supérieur)
> > dim tabSolution() as string
> > dim lngSolution as long
> > dim lngAllGrille as long
> >
> > function lancement()
> > lngcombi = 3
> > lngallgrille
> > tabresult() = matrice de l'exemple
> > redim tabcombi(1 to lngallgrille) 'tableau avec une dimension avec
> > que
des
> 0
> > frecursive_combinaison 1,1,"", tabcombi
> >
> > end function
> >
> > Function fRecursive_Combinaison(x, ind, strCombi As String,
> > tabCombi()
As
> > Integer)
> > '** Fonction récursive pour les combinaisons
> > Dim lngResult As Long
> > Dim tabCombi_tmp() As Integer
> > Dim strCombi_tmp As String
> >
> > tabCombi_tmp = tabCombi
> > strCombi_tmp = strCombi
> >
> > For b = x To lngAllGrille
> > lngResult = 0
> > If strCombi_tmp = "" Then
> > strCombi = b
> > Else
> > strCombi = strCombi_tmp & ";" & b
> > End If
> >
> > If ind < lngCombi Then
> > For c = 1 To lngAllGrille
> > If tabCombi_tmp(c) + tabResult(b, c) = 0 Then
> > tabCombi(c) = 0
> > Else
> > tabCombi(c) = 1
> > End If
> > Next
> > fRecursive_Combinaison b + 1, ind + 1, strCombi, tabCombi
> > Else
> > '** resultat
> > For c = 1 To lngAllGrille
> > If tabCombi_tmp(c) + tabResult(b, c) <> 0 Then
> > lngResult = lngResult + 1
> > Else
> > Exit For
> > End If
> > Next
> > If lngResult = lngAllGrille Then
> > '** Chargement d'une solution dans le tableau tabSolution
> > lngSolution = lngSolution + 1
> > ReDim Preserve tabSolution(1 To lngSolution)
> > tabSolution(lngSolution) = strCombi
> > End If
> > End If
> > Next
> >
> > End Function
> >
> >
> > --
> > @+
> > Jessy Sempere - Access MVP
> >
> > ------------------------------------
> > Site @ccess : http://access.jessy.free.fr/
> > Pour l'efficacité de tous :
> > http://www.mpfa.info/
> > ------------------------------------
> > "Patrice" a écrit dans le message de
> > news:
> > > Difficile à dire sans voir le code. Le problème est peut-être qu'un
> > tableau
> > > est un objet donc un simple pointeur. Que le pointeur soit passé
> > > par
> > > référence ou par valeur, il pointe de toute façon sur les données
> > originales
> > > ce qui annihile la récursivité.
> > >
> > > Peut-être un tableau de tableaux, l'un des arguments de dimension
étant
> le
> > > niveau de récursivité.
> > >
> > > Il est peut être possible aussi de revoir l'algo. Le fond du


problème
> est
> > > veux tu vraiment que chaque niveau de récursivité ait son propre
tableau
> ?
> > > Cela impliequerait de copier les données à chaque niveau de qui
> > > peut
> > > peut-être être évité (par exemple avec une pile).
> > >
> > >
> > > --
> > > Patrice
> > >
> > > "Jessy Sempere [MVP]" a écrit dans le
> message
> > de
> > > news:43f48aaf$
> > > > Re,
> > > >
> > > > Merci pour ta réponse...
> > > > En fait je pense savoir d'où viens le problème, en VBA, les
arguments
> > > passer
> > > > dans une fonction sont passer par défaut par référence, surtout
> > > > un
> > > argument
> > > > tableau qui ne peut pas être passé par valeur...
> > > > Visiblement, sous VB.NET, cette contrainte n'éxiste pas lorsque


j'ai
> > > > retranscri mon code VBA sous VB.NET, il m'a mis pour tous mes
> arguments
> > > > ByVal y compris pour mon argument tableau...
> > > >
> > > > Je ne peux pas tester au boulot mais je testerais ce soir pour
> vérifier
> > ma
> > > > théorie ???
> > > >
> > > > Sinon, en terme de rapidité, est ce qu'après compilation de mon


code
> si
> > il
> > > > fonctionne j'aurais les même performances que si je faisais plus


ou
> > moins
> > > le
> > > > même code sous C ???
> > > >
> > > > @+
> > > > Jessy Sempere - Access MVP
> > > >
> > > > ------------------------------------
> > > > Site @ccess : http://access.jessy.free.fr/
> > > > Pour l'efficacité de tous :
> > > > http://www.mpfa.info/
> > > > ------------------------------------
> > > > "TroXsA" a écrit dans le message de
> > > > news:dt1u5u$nab$
> > > > > Bonjour,
> > > > >
> > > > > Voilà un exemple de récursivité avec tableau ArrayList
> > > > >
> > > >
> > >
> >
>



http://www.troxsa.info/index.php?option=com_content&task=view&id&Itemid=2
> > > > >
> > > > > je sais pas si c'est bien ça que vous cherchiez ! mais bon ça


peut
> > aidé
> > > !
> > > > >
> > > > > Cordialement
> > > > >
> > > > > --
> > > > >
> > > > > Mail : http://cerbermail.com/?rIXgaw9Xsl
> > > > > Site : http://troxsa.info
> > > > >
> > > > >
> > > > > "Jessy Sempere [MVP]" a écrit dans


le
> > > message
> > > > de
> > > > > news: 43f477f0$
> > > > > > Bonjour à tous
> > > > > >
> > > > > > J'ai fais un bout de code sous Access donc en VBA...
> > > > > >
> > > > > > Ce code utilises une fonction récursive qui marche très bien,
par
> > > contre
> > > > > > elle a 2 arguments :
> > > > > > - un de type string,
> > > > > > - et un tableau.
> > > > > >
> > > > > > Les 2 évolues en fonction du niveau de récursivité.
> > > > > >
> > > > > > Le problème est la lenteur de cette récursivité, pour
> éventuellement
> > > > > > accélérer tout ça, j'ai retranscrit
> > > > > > mon code en VB .NET sous visual studio .net...
> > > > > >
> > > > > > A mon grand désespoir, la récursivité pour l'argument de type
> string
> > > > > > fonctionne mais pas celle pour l'argument tableau, celui-ci
> > > > > > ne
> garde
> > > par
> > > > > > ses
> > > > > > valeurs en fonction du son niveau de récursivité ???
> > > > > >
> > > > > > Ma question est donc peut-on faire sous VB .NET une fonction
> > récursive
> > > > > > avec
> > > > > > un
> > > > > > argument tableau où est-ce impossible ???
> > > > > >
> > > > > > Merci à tous de vos lumière.
> > > > > >
> > > > > > @+
> > > > > > Jessy Sempere - Access MVP
> > > > > >
> > > > > > ------------------------------------
> > > > > > Site @ccess : http://access.jessy.free.fr/
> > > > > > Pour l'efficacité de tous :
> > > > > > http://www.mpfa.info/
> > > > > > ------------------------------------
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>