2010-07-26 9 views
4

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

+0

Existe-t-il d'autres limitations sur a_i? par exemple a_i> = 0? –

+0

a_i> = 0, oui! Merci! – John

Répondre

3

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); 
    } 
} 
+0

vous avez besoin de j <= i + 1 probablement en condition de boucle. – Vladimir

+0

@Vladimir fixé, merci. –

+0

J'ai aussi supposé a_i> = 0. –

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); 
    } 
} 
+0

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. –

+1

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

+0

Teodor, tu as oublié de remplacer le 'i' de la solution d'Amir par 'counter', non? Merci pour les informations sur le 'backtracking'. –