next up previous contents index
suivant: Programme donnant toutes les monter: Les permutations précédent: Les permutations   Table des matières   Index

Les permutations circulaires

On écrit la fonction circulaire(l) qui renvoie la liste obtenue à partir de l en renvoyant le début de la liste l à la fin de l.
//l:=[1,2,3]; circulaire(l) 
//renvoie la liste l ou la tete est mise a la fin. 
circulaire(l):={
return concat(tail(l),l[0]);
};
On écrit la fonction permcir(l) qui renvoie la liste des permutations circulaires obtenues à partir de l. On écrit cette fonction récursivement en renplacant l par circulaire(l). Il faut un test d'arrêt pour ce parcours, pour cela on a besoin d'un paramètre supplementaire qui sera ld : c'est une liste de référence égale à l au départ et qui n'est pas modifiée. On s'arrête quand circulaire(l)==ld, c'est à dire quand on retrouve la liste de départ. On utilise une variable locale lr égale à la liste à renvoyer.
// utilise circulaire, l:=[1,2,3];permcir(l,l); 
//renvoie les permutations circulares de l
//variable locale lr la liste resultat
// ld liste reference de depart
permcir(l,ld):={
local lr;
if (circulaire(l)==ld) return [l];
lr:=[l];
lr:= append(lr,op(permcir(circulaire(l),ld)));
return lr;
};
On peut supprimer la variable locale lr et la fonction circulaire.
On écrit alors la fonction permcc(l) qui renvoie la liste des permutations circulaires obtenues à partir de l.
Ici, on utilise un autre test d'arrêt, on a toujours besoin d'un paramètre supplementaire qui sera ld : c'est une liste de référence égale à l au départ et qui est modifiée, sa taille diminue de 1 à chaque appel récursif. On s'arrête quand ld==[], c'est à dire quand on a fait autant d'appels que la taille de l.
//l:=[1,2,3];permcc(l,l); 
//renvoie les permutations circulares de l
//sans variable locale, ld liste reference de depart
permcc(l,ld):={
if (ld==[]) return [];
return [l,op(permcc(concat(tail(l),l[0]),tail(ld)))];
};
Comme il faut 2 paramètres pour écrire la fonction récursive permcc, on écrit la fonction finale permutation_circ qui utilise permcc :
//l:=[1,2,3];permutation_circ(l); 
//renvoie les permutations circulares de l
//utilise permcc
permutation_circ(l):={
return permcc(l,l);
};
On tape :
permutation_circ([1,2,3])
On obtient :
[[1,2,3],[2,3,1],[3,1,2]]


next up previous contents index
suivant: Programme donnant toutes les monter: Les permutations précédent: Les permutations   Table des matières   Index
Documentation de giac écrite par Renée De Graeve