Algorithme : Par quoi remplacer un bloc Select case?

[Fermé]
Signaler
Messages postés
7
Date d'inscription
jeudi 1 décembre 2005
Statut
Membre
Dernière intervention
19 octobre 2013
-
Messages postés
7
Date d'inscription
jeudi 1 décembre 2005
Statut
Membre
Dernière intervention
19 octobre 2013
-
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.


1 réponse

Messages postés
1953
Date d'inscription
lundi 3 mai 2010
Statut
Membre
Dernière intervention
12 août 2021
151
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+
Messages postés
7
Date d'inscription
jeudi 1 décembre 2005
Statut
Membre
Dernière intervention
19 octobre 2013

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