Je cherche un algorithme (ou une implémentation de type C, pas d'outils disponibles) qui génère tous les tuples [a_0 a_1 ... a_ (n-1)] tel que 0 < = a_i < = i + 1. Les pointeurs vers la littérature sont également les bienvenus.Génération de tuples index modulo
Répondre
quelque chose comme ça?
void printTuples (int n, int[] a, int i=0) {
if (i == n) {
//print a
return;
}
for (int j=0; j<=i+1; j++) {
a[i] = j;
printTuples (n, a, i+1);
}
}
vous avez besoin de j <= i + 1 probablement en condition de boucle. – Vladimir
@Vladimir fixé, merci. –
J'ai aussi supposé a_i> = 0. –
Cela s'appelle backtracking. Recherche wikipedia à ce sujet. Vous pouvez le faire à la fois récursif ou itératif. Amir, il veut entre 0 et i + 1, pas entre 0 et i. Et je pense que les tableaux de passes sur la pile sont plus lents que de les voir comme globaux.
Je pense que vous voulez quelque chose comme ceci:
int a[YOUR_LENGTH];
void backtracking (int n, int counter) {
if (counter == n) {
// do whatever
return;
}
for (int j = 0; j <= counter + 1; ++ j) {
a[counter] = j;
backtracking(n, counter + 1);
}
}
J'ai corrigé le problème <= et les tableaux sont passés comme des pointeurs. de toute façon, je ne sais pas sur quelle langue et quelle plate-forme il va utiliser, donc ce n'est pas vraiment pertinent. –
Habituellement, il vaut mieux éviter les globals. Il fait marche arrière, les quelques millisecondes que vous pourriez gagner en utilisant un global ne valent vraiment pas le coup. – IVlad
Teodor, tu as oublié de remplacer le 'i' de la solution d'Amir par 'counter', non? Merci pour les informations sur le 'backtracking'. –
Existe-t-il d'autres limitations sur a_i? par exemple a_i> = 0? –
a_i> = 0, oui! Merci! – John