Algorithme : Par quoi remplacer un bloc Select case?

Fermé
Kotam Messages postés 7 Date d'inscription jeudi 1 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013 - Modifié par Kotam le 18/10/2013 à 06:28
Kotam Messages postés 7 Date d'inscription jeudi 1 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013 - 18 oct. 2013 à 16:01
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

Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
18 oct. 2013 à 09:38
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 jeudi 1 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
18 oct. 2013 à 16:01
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