Accueil > Forum > > > > probleme d'enumeration des parties d'un ensemble
probleme d'enumeration des parties d'un ensemble
vendredi 14 novembre 2008 à 10:54:36 |
probleme d'enumeration des parties d'un ensemble

martaniF
|
bonjour a tous, j'ai un serieux probleme le voila pour n entier donné on cherche les solutions de a1+a2+....=n avec les a dans un ensemble l et l'ordre des a compte par exemple si l={1,2} et n=4 donc les solutions: 2+2; 2+1+1 1+2+1 1+1+2 1+1+1+1et l'autre probleme c on a un ensemble E a n element on cherche les ensemble des parties deux a deux disjoints et de taille dans la liste l et dont l'union et E. exemple E={a,b,c} et l={2,1} donc la solution c {{a},{b},{c}},{{a},{b,c}},{{b},{a,c}},{{c},{a,b}}j'espere que vous pouvez m'aider en plus si les sol sont dans un language fonctionnel ça serai mieux salut a tous voici l'algo su premier probleme mais il compte pas l'ordre c implementer en OCAML let rec ajout a l= match l with []->[] |x::s->[a::x]@(ajout a s);; let rec enum n p= if n<=0 then [[]] else begin if p=[] then [] else begin let x::s=p in if x<=n then (ajout x (enum (n-x) p))@(enum n s) else enum n s end end;;enum 4 [1;2]donne [[2;2];[1;1;1;1];[1;1;2]];;et meme c vous connaissez pas la programmation fonctionnel c pas grave juste des solution meme logique dans n'importe quel language, et s'il vous plait pas de programme qui faire exploser la pile , je c que c'est tres difficile a le faire meme avec la theorie des graphe. anyway have greate times every one w8in for ur help merci d'avance 
|
|
vendredi 14 novembre 2008 à 11:50:51 |
Re : probleme d'enumeration des parties d'un ensemble

coucou747
|
salut
moi je vais juste commenter ton code ocaml :
pourquoi tu mets des begin et des end ? pourquoi utilises tu l'operateur @ ? (il est super lent...)
a la place de :
let rec ajout a l= match l with []->[] |x::s->[a::x]@(ajout a s);;
tu peux mettre :
let rec ajout a = function | [] ->[] | x::s ->a::x::(ajout a s);;
ce qui est plus court, plus simple, et plus rapide (mais c'est pas tail-rec, donc ca peut faire sauter la pile).
bon ta fonction ajout, elle ajoute a entre chaque element de la liste passee en parametre... je ne saisis pas bien l'utilite de la chose.
|
|
vendredi 14 novembre 2008 à 13:08:34 |
Re : probleme d'enumeration des parties d'un ensemble

martaniF
|
bonjour merci beacoup pour ta reponse, premierement ta fonction est fausse, elle est pas bien typé, car OCAML quand il rencontre le :: il pense que c'est un element et pas une liste a concaténer, et voici un exemple du code qui fonctionne pas: ajout 1 [[12];[4]];; Characters 9-13: ajout 1 [[12];[4]];; ^^^^ This expression has type 'a list but is here used with type intet meme un autre qui fonctionne mais donne des resultats fausses: ajout 1 [1;2;3];; - : int list = [1; 1; 1; 2; 1; 3]en tt cas pour l'utilisation des begin et des end c parceque OCAML est comme dans les autre language par exemple C++ dans une boucle ou un bloc if si tu met pas les accolades {} il va just associer la prochaine instruction juste apres le if avec ce if et il va continuer normalement, par exemple if a=b then doThing1 ; DoThing2ici OCAML va executer doThing1 juste si a=b mais doThing2 va s'executer toujours, alors pour les arranger vous ajouter les begin et les end if a=b then begin doThing1 ; doTing2 endanyway le programme il procede comme suit, ajout elle accepte une int -> int list list -> int list list et ejoute a chaque liste un entier a l'entete de chaque element (qui est une liste encore) ex: ajout 1 [[3;4];[4;5;7]];; donne [[1;3;4];[1;4;5;7]] ok la fonction enum elle precede comme suit, pour enumere un entier n sur un ensemble on procede comme suit si l'ensemble et vide en renvoit simplement la liste vide sinon on prend le premier element de la liste x des partie et on enumere recursivement l'entier (n-x) sur la liste qui reste s tout en ajoutant a la fin ce x a l'ensemble des partie qu'on obtient et apres en enumere encore n sur la liste restante s, c ça i hope that helps, 
|
|
vendredi 14 novembre 2008 à 13:22:01 |
Re : probleme d'enumeration des parties d'un ensemble

coucou747
|
hum... j'avais pas compris ta fonction : let ajout a li = List.map (fun x -> a::x) li;;
et je persiste... pour une seule instruction, begin et end ca ne sert a rien.
|
|
vendredi 14 novembre 2008 à 13:32:44 |
Re : probleme d'enumeration des parties d'un ensemble

martaniF
|
ok donc 100 euros si le begin end compte ok  voila essaye de taper cette fonction en OCAML let rec fn a = if a=5 then print_int a else print_int 0 ;fn (a-1);; apparemment elle va faire la reccurence jusqu'a 5 c ça? ok essaye par exemple fn 10;; et voir ce qui donne ici on veut appeler la fonction jusqu'a 5 si ce n'est 5 encore en affiche 0 et on appele la fonction pour a -1 ok d'accord le probleme c que la fonction boucle infiniment comme ça car l'appel récursif se fait toujours car il y a acune condition pour arreter donc plutot pour arreter en 5 en ajout les begin et end dans la branche else voir ça let rec fn a = if a=5 then print_int a else begin print_int 0 ;fn (a-1) end;; essaye fn 10;; waw elle affiche 0 0 0 0 0 5 et arrete c cool ha, j'espere que ta compris l'utilité de begin et end, ok tu prepare les 100 euro je vais te communiquer mon compte pour les envoyer lol  salut je veux des reponse pas de debogage de code svp, le compilateur c faire ça mieux salut
|
|
vendredi 14 novembre 2008 à 13:39:49 |
Re : probleme d'enumeration des parties d'un ensemble

coucou747
|
quand t'as deux instructions, tu peux faire comme ca :
let rec fn a = if a=5 then print_int a else let _ = print_int 0 in fn (a-1);;
bon, pour resumer, ajout c'etait ca :
let ajout a li = List.map (fun x -> a::x) li;;
et enum ca donne ceci :
let rec enum n p= if n<=0 then [[]] else match p with | [] -> [] | x::s -> if x<=n then (ajout x (enum (n-x) p)) @ (enum n s) else enum n s;;
avoue, c'est beaucoup plus court :)
chez moi ca concerve l'ordre :)
# enum 4 [1;2];; - : int list list = [[1; 1; 1; 1]; [1; 1; 2]; [2; 2]]
|
|
vendredi 14 novembre 2008 à 14:47:38 |
Re : probleme d'enumeration des parties d'un ensemble

martaniF
|
a oui j'ai compris ce que tu veux dire aujourdhui, ok c cool je sais faire comme ça mais il dise t'aura 5 sur la lisibilité du code donc... tu c en tt cas mon probleme comme g dit c l'ordre # enum 4 [1;2];; - : int list list = [[1; 1; 1; 1]; [1; 1; 2]; [2; 2]] ton affichage et tt a fait correcte mais je veux plutot ça moi # enum 4 [1;2];; - : int list list = [[1; 1; 1; 1]; [1; 1; 2]; [1; 2; 1]; [2; 1; 1]; [2; 2]] veut dire toutes les combainisons possibles avec l'ordre qui compte donc [2;1;1] c diff de [1;2;1] j'espere que c clair aujourdhui merci pour tes reponse 
|
|
vendredi 14 novembre 2008 à 15:29:13 |
Re : probleme d'enumeration des parties d'un ensemble

coucou747
|
si c'est un exercice de cours, alors il est debile..
let rec f n li =
if n < 0 then failwith("f") else
if n = 0 then [[]]
else let rec f2 = function
| [] -> []
| hd::tl -> if hd > n
then f n tl
else List.append
(List.map (fun x -> hd::x) (f (n - hd) li) )
(f2 tl)
in f2 li;;
f 5 [1;2;3];;
# f 4 [1;2];;
- : int list list = [[1; 1; 1; 1]; [1; 1; 2]; [1; 2; 1]; [2; 1; 1]; [2; 2]]
ton probleme, c'est que tu listais ca sur le reste de la liste, et pas sur la liste en entier
Bon, sinon, c'est pas DU TOUT tail-rec, donc ca va faire sauter la stack. malheureusement, mettre un accumulateur pour faire ca en tail-rec, ca risque de le rendre moins lisible et plus lent...
|
|
samedi 15 novembre 2008 à 00:03:17 |
Re : probleme d'enumeration des parties d'un ensemble

martaniF
|
waw c tres rapide!!!!!!!!!!!!! dite, comment ta fait pour trouver la solution? c vraiment geneale ça! et en plus ta utiliser OCAML ou, c ma premiere année et je trouve vraiment de difficulte pour migrer de la prog impérative (c# vb.net asp.net) vers les trucs fonctionnels, anyway le code foncionne tres bien mais, je te dis la verite, j'ai pas bien compris ce qui ce passe en plus, le faite de difinir une fonction dans une autre et toutes les deux s'appelle comment ça ce passe dedans? est ce que a chaque appele recursif de f2 le compilateur creer une nouvelle fonctin et reserve un espace dans la pile? et c pas un exercice de cours mais un projet de combinatoire informatique, je te tire le chapeau c tres cooooooooooooooool merci beaucoup 
|
|
samedi 15 novembre 2008 à 13:37:22 |
Re : probleme d'enumeration des parties d'un ensemble

coucou747
|
Réponse acceptée !
lol t'as un projet de combinatoire que tu vas rendre et qui ne fait que 10 lignes :D
let rec f n li =
if n < 0 then failwith("f") else (* si n est inferieur a 0 c'est qu'on est alle trop loin. *)
if n = 0 then [[]] (* si n = 0 alors c'est la combinaison vide*)
else let rec f2 = function (* ici, on definit une nouvelle fonction pour pouvoir parcourrir la liste li *)
| [] -> [] (* si on a fini le parcourt*)
| hd::tl -> if hd > n (* si hd est superieur a n, alors on ne peut pas mettre hd dans la liste, on continue donc juste le parcourt. *)
then f2 tl (* en me relisant, j'ai vu une erreur ici, en fait, on doit continuer le parcourt de la liste. *)
else List.append (*ici, c'est une traduction de ton @ et de ta fonction ajouter.*)
(List.map (fun x -> hd::x) (f (n - hd) li) )
(f2 tl)
in f2 li;; (* enfin, on appelle f2*)
clique sur reponse acceptee stp.
|
|
Cette discussion est classée dans : probleme, enum, ensemble, parties, if
Répondre à ce message
Sujets en rapport avec ce message
probleme enum [ par zhebulonn ]
Bonjour, j'ai un soucis avec l'utilisation enum. Dans un .h, je défini : class MemoirePartagee { public: typedef enum {DONNEE_INTEGER=0, DONNEE_FLOAT}
var enum [ par MBALHOUSSE ]
est ce que quelqu'un peut m'aider,je sais pas comment utiliser le var enum dans une condition if,est ce que je peux faire ça, parce que en visuel C++
Probleme pour integrer Upload Ftp ^^' [ par inf12 ]
Bonjour tous le monde j'ai un soucis avec ce code ^^' :#include int test(netbuf *conn){ char* serveur = "ftp.tonserveur.com"; c
Probleme de concatenuation [ par romainbisson ]
Bonjour,j'ai ce probleme avec dev c++invalid conversion from `char' to `const char*' -- ligne 24 #include #include int main(int argc, char
probleme de connexion sql serveur 200 [ par mniajnaa ]
bonjour je viens d'installer sql serveur 200 mon probleme c'est que avant de creer une base de donnees j'essai de se connecter mais la conne
projet bataille navale problème!!! [ par krimoluv ]
Bonsoir à tous,voila j'ai mon projet bataille navalle qui approche les 1900 lignes. Malheuresement je n'ai pas eu le resultat esconté car en compilant
Probleme un peu bidon [ par romainbisson ]
Bonjour,je souhaite ecrire dans monn fichier au début de chaque ligne,7, 7,7,mais je souhaite que sur la dernier ligne, il ne m'affiche pas le 7,f
Déplacement d'image BMP avec Win APi [ par hiroko ]
En esperant etre dans la bonne catégorie...Voilà mon problème, je dois créer un Snake en C avec Win APIEt j'ai des gros problème d'affichage.Je cherch
Probleme sur une forme simple [ par faucheuse ]
Tout d'abord je ne travaille pas sous Linux mais sous WindowsXP mais je n'ai pas trouver de sous-forum correspondant dsl.Alors voila, j'essaye de fair
constructeur en privé [ par deubix ]
bonjour a tous, alors voila je dois faire un projet ou dedans j'ai une classe qui a pour nom "Vehicule".J'ai une autre calsse qui a pour nom "Probleme
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|