Algorithme : Par quoi remplacer un bloc Select case?

Kotam Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -  
Kotam Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous,

J'ai un souci sur un algorithme et j'aimerais solliciter votre aide.

Je vais essayer d'exposer le problème même s'il risque d'être un peu flou et je finirai avec un exemple pour illustrer mon souci.

Merci d'avance pour vos conseils.

Enoncé du cas :

Je voudrais construire une fonction qui retourne n éléments , tirés parmi un ensembe de p éléments, et qui satisfont à certaines conditions.

n et p ne sont pas connus d'avance mais sont des paramètre de la fonction qui retournera une liste en guise de résultat.

Pour l'instant, je n'ai pas trouvé de boucle générique/ou général, je ne sais pas lequel est le plus approprié, pour générer la solution et je suis obligé de gérer au cas par cas par l'intermédiaire d'un bloc select case. Si le nombre d'éléments à tirer était limité, ce ne serait pas trop gênant (dans l'exemple que j'ai mis plus bas, je me suis arrêté à 3 éléments max. En revanche, quand le nombre d'éléments à tirer commence à devenir important (exemple une vingtaine), j'imagine le code qu'il va falloir produire).

Question :
Auriez-vous une proposition pour remplacer ce bloc select case par une boucle générique compacte?

Merci d'avance

Exemple :

L'exemple suivant tire n éléments parmi les p premiers entiers natures dont la somme est égale au nombre s. p, n et s sont les paramètres de la fonction dans cet exemple

p=9 (1 à 9)
n=3
s=15
Résultat = 159-168-186-195-249-258-267-276-285-294-348-357-375-384-429-438-456-465-483-492-519-528-537-546-564-573-582-591-618-627-645-654-672-681-726-735-753-762-816-825-834-843-852-861-915-924-942-951



Option Explicit
Option Base 1

Type Liste
T() As Integer
End Type

Sub Essai()
Dim i, p, n, s As Integer
Dim Resultat As Liste
Dim Representation As String

p = Val(InputBox("p")) 'p = nombre des éléments parmi lesquels seront retenus les choix
n = Val(InputBox("n")) 'n = nombre d'éléments à tirer
s = Val(InputBox("s")) 's = conditions à respecter par les éléments tirés

Resultat = Exemple(p, n, s)
Representation = ""

For i = 1 To UBound(Resultat.T)
Representation = Representation & "-" & Resultat.T(i)
Next i
Cells(1, 1) = Representation
End Sub

Function Exemple(ByVal p As Integer, ByVal n As Integer, ByVal s As Integer) As Liste
Dim i, j, k, T() As Integer
Dim Solution As Liste

ReDim T(1 To p)
ReDim Solution.T(1)

For i = 1 To p
T(i) = i 'Dans cet exemple, on remplit le tableau avec les entiers de 1 à p
Next i

Select Case n
Case 1
For i = 1 To p
If T(i) = s Then
Solution.T(1) = T(i)
End If
Next i
Case 2
For i = 1 To p
For j = 1 To p
If i <> j And T(i) + T(j) = s Then
ReDim Preserve Solution.T(1 To UBound(Solution.T) + 1)
Solution.T(UBound(Solution.T)) = T(i) & T(j)
End If
Next j
Next i
Case 3
For i = 1 To p
For j = 1 To p
For k = 1 To p
If i <> j And j <> k And i <> k And T(i) + T(j) + T(k) = s Then
ReDim Preserve Solution.T(1 To UBound(Solution.T) + 1)
Solution.T(UBound(Solution.T)) = T(i) & T(j) & T(k)
End If
Next k
Next j
Next i

'Case 4 avec i,j,k,l
'Case 5 avec i,j,k,l,m
'et ainsi de suite jusqu'à x éléments

End Select
Exemple = Solution
End Function


Merci d'avoir lu la question jusqu'à la fin.
Kotam.


A voir également:

1 réponse

Zoul67 Messages postés 1959 Date d'inscription   Statut Membre Dernière intervention   149
 
Bonjour,

ça me semble presque récursif...
Si on considère les ensembles et non les listes ordonnées ; pour chaque i
Exemple(p,n,s)={i} U Exemple(p,n-1,s-i)

A+
0
Kotam Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 
Merci pour votre reponse. Pourriez-vous me mettre un exemple de code illustrant votre explication? En effet, j'ai déjà pense a une fonction recursive mais je n'ai pas pu la coder pour le moment. Merci d'avance
0