Generowanie wariacji z powtórzeniami

0

Postanowiłem sobie do mojego małego projekciku dołączyć generowanie tablic prawdy. W przeciwieństwie do klasycznych tablic dwustanowych muszę dołączyć jeszcze trzeci stan. Chcę wygenerować wszystkie możliwe wejścia, by móc obliczyć wyjście, przy czym dobrze by było, by algorytm generujący dawał wszystkie możliwe wariacje bez względu na ilość elementów na wejściu.

Te wygenerowane wejścia są przedstawione w postaci tablicy obiektów Entry, gdzie każdy pojedynczy obiekt zawiera daną kombinację na wejściu. Przykładowo, dla dwóch wejść (stan trzeci oznaczony literą u):

00
01
0u
10
11
1u
u0
u1
uu

(każda linijka to oddzielny obiekt Entry).

Zastanawiałem się, jak to ugryźć. Myślałem na początku, by po wyliczeniu ilości możliwych kombinacji (dla n wejść jest ich 3^n), po czym:

  1. Podzielić tablicę na trzy części
  2. Każdej z części dać na początku wartość kolejno 0, 1 lub u
  3. Każdą z części ponownie podzielić na trzy części i czynności powtarzać n razy.
    Ale nie wydaje mi się, żeby takie rekurencyjne rozwiązanie było najbardziej optymalne.

Może ktoś z was robił kiedyś coś podobnego?

0

Dobra, sam na to wpadłem. Pewnie można było lepiej, ale trudno.
Pseudokod:

int n; //liczba wejść
Entry[] table = new Entry[3^n];
for (int i = 0; i < 3^n; i++) {
   int[] state = new int[n]; //możliwe stany: 0, 1, 2
   int k = 0;
   for (int j = n - 1; j >= 0; j--) {
      state[k] = ( i / (3^j) ) %3;
      k++;
   }
   table[i] = new Entry(state);
}
1

Podpowiedź: możesz wykorzystać system o podstawie 3.

1 użytkowników online, w tym zalogowanych: 0, gości: 1