//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.
//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 :