Algorithme : Par quoi remplacer un bloc Select case?
Kotam
Messages postés
8
Statut
Membre
-
Kotam Messages postés 8 Statut Membre -
Kotam Messages postés 8 Statut Membre -
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
Merci d'avoir lu la question jusqu'à la fin.
Kotam.
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:
- Algorithme : Par quoi remplacer un bloc Select case?
- Logiciel algorithme euromillion - Télécharger - Loisirs créatifs
- Algorithme application pc - Télécharger - Édition & Programmation
- Algorithme euromillion excel gratuit - Forum Algorithmes / Méthodes
- Algorithme ajout rapide snapchat - Forum Snapchat
- Ajout rapide snap - Forum Snapchat
1 réponse
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+
ç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+
Kotam
Messages postés
8
Statut
Membre
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