Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Autres langages > Algorithmes

Algorithmes Forum d'entraide sur l'algorithmique, l'intelligence artificielle, le traitement numérique d'images et les mathématiques. Avant de poster : Cours d'algorithmique

Réponse
 
Outils de la discussion
Vieux 12/11/2008, 15h08   #1 (permalink)
Membre à l'essai
 
Date d'inscription: décembre 2006
Messages: 43
Par défaut Combinaisons n parmis p

Bonjour à tous

voilà je suis sur un projet actuellement et j'aurais voulu savoir si il existe en c (voir en c++) une fonction qui donne la liste de toutes les permutations de n parmis p.

Si cela n'existe pas pourriez vous m'aider pour un algorithme.

je cherche un algo qui prend en paramètre 2 chiffres (x et y tel que x<=y) et un pointeur sur un tableau d'entier(à double entrée).
L'algorithme calcul le nombre de combinaisons possible (x parmis y, j'ai déjà créé cette fonction (x parmis y=y!/((y-x)!*x!)=k), ce qui donnent la taille du tableau (y*k) et créé le tableau . Le soucis c'est que je ne trouve pas d'algorithme pour remplir le tableau avec des 1 et 0.


Exemple de solutions : Combinaison(p,3,5)
3 parmis 5 = 10

tableau p(taille=5*10):
0)11100
1)11010
2)11001
3)10110
4)10101
5)10011
6)01110
7)01101
8)01011
9)00111

Si quelqu'un à un début de piste, j'en serait reconnaissant

PS:
existe t'il dejà les fonctions Factoriel et Combinaison en c? ou dois-je gardais celles que j'ai créées?
Darksnakes est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/11/2008, 21h57   #2 (permalink)
Rédacteur/Modérateur
 
Avatar de Zavonen
 
Date d'inscription: novembre 2006
Localisation: Boulogne sur Mer
Âge: 61
Messages: 1 071
Par défaut

Thème récurrent il y a beaucoup de ressources sur ce forum, en particulier:
http://www.developpez.net/forums/d42...-combinaisons/
Voir aussi mon cours BASES-->ensembles-->parties
__________________
Ce qu'on trouve est plus important que ce qu'on cherche.
Maths de base pour les nuls (et les autres...)
Zavonen est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 14h39   #3 (permalink)
Membre à l'essai
 
Date d'inscription: décembre 2006
Messages: 43
Par défaut

A première vu c'est ce qu'il me faut
Je vais essayer ça dessuite et vous tenir au courant merci beaucoup
Darksnakes est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/11/2008, 10h00   #4 (permalink)
Membre à l'essai
 
Date d'inscription: décembre 2006
Messages: 43
Par défaut

j'ai réussi a adapter ta solution, merci bcp

par contre je suis tomber sur une autre solution :

Code :
void afficher( int *p, int n) {
  int i;
  for (i = 0; i < n; i++) printf("%d ", p[i]);
  printf("\n");
}

void combi2(int cmb[], int n, int p , int i, int k) {
    if (k == p) afficher(cmb,p);
    else if (i < n) {
        combi2(cmb,n,p,i+1,k);
        cmb[k] = i;
        combi2(cmb,n,p,i+1,k+1);
    }
}



int main() {
  int combi[3];
  combi2(combi,5,3,0,0);
  return 0;
}
j'aurais voulu comprendre le fonctionnement, ou plutot la logique de l'algo.
merci d'avance


Yann
Darksnakes est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/11/2008, 12h22   #5 (permalink)
Rédacteur/Modérateur
 
Avatar de Zavonen
 
Date d'inscription: novembre 2006
Localisation: Boulogne sur Mer
Âge: 61
Messages: 1 071
Par défaut

J'ai regardé ça vite fait. A priori je ne comprends pas la logique non plus. Ce n'est pas documenté du tout. Pour comprendre il faudrait faire une trace, bref cela prend du temps...
__________________
Ce qu'on trouve est plus important que ce qu'on cherche.
Maths de base pour les nuls (et les autres...)
Zavonen est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/11/2008, 12h30   #6 (permalink)
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Date d'inscription: décembre 2006
Localisation: Montpellier
Âge: 36
Messages: 4 727
Par défaut

C'est le meme principe que celui que j'ai posté.

La différence etant que pour une profondeur donnée je fais le parcours des éléments possibles avec une boucle for():
Code java :
 
for(int i=start;i<n;i++) {  // <-- parcours des éléments possibles
    liste[index]=i;
    partition(index+1);  // <-- passage a la profondeur suivante
} 
 

alors que dans le meme cas il font le parcours des éléments possibles par récursion:
Code C :
 
if (i < n) {
    combi2(cmb,n,p,i+1,k);  // <-- parcours des éléments possibles
    cmb[k] = i;
    combi2(cmb,n,p,i+1,k+1);  // <-- passage a la profondeur suivante
}
 
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 24/11/2008, 20h44   #7 (permalink)
Membre à l'essai
 
Date d'inscription: décembre 2006
Messages: 43
Par défaut

ok merci beaucoup

bonne soirée!!
Darksnakes est déconnecté   Envoyer un message privé Réponse avec citation
NEWS ALGOCOURS ALGOFAQ ALGOLIVRES ALGOSOURCES ALGO

Réponse

Précédent   Forum des développeurs > Autres langages > Algorithmes



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide