Mam problem - jak dla podanego n wygenerować (po kolei, nie muszą być zapamiętywane) wszystkie możliwe tablice zero-jedynkowe (bez powtórzeń)?
Np. dla n=2:
0,0
0,1
1,0
1,1
Dla n=3:
0,0,0
1,0,0
0,1,0
1,1,0
0,0,1
1,0,1
0,1,1
1,1,1
Mam problem - jak dla podanego n wygenerować (po kolei, nie muszą być zapamiętywane) wszystkie możliwe tablice zero-jedynkowe (bez powtórzeń)?
Np. dla n=2:
0,0
0,1
1,0
1,1
Dla n=3:
0,0,0
1,0,0
0,1,0
1,1,0
0,0,1
1,0,1
0,1,1
1,1,1
Rekurencyjnie. Przekazujesz do funkcji n, oraz pustą listę, a wewnątrz funkcji:
w kometarzu masz wszystko:
w metoda pierwsza wywolana z innymi parametrami bedzie rowniez dzialac dla zupelnie innych znakow np. kombinacje1(5,"abcd",4); zrobi Ci kombinacje abcd na sposob taki jak podales wyzej dla n=5
#include <cstdio>
/* sposob pierwszy - bardziej ogolny */
char stos_baza[32]; // mysle ze nie bedziesz generowal dla wiecej niz n=31, bo bys to pol dnia na ekran wypisywal
char* stos = stos_baza; // wskaznik na puste miejsce na szczycie stosu
void push(char znak)
{
*stos++ = znak; // na szczycie stosu klade znak, i przesuwam szczyt stosu do gory
}
void pop()
{
*--stos = 0; // zmniejszam wskaznik stosu, czyli po prostu wywalam znak
// do nowego szytu stosu przypisuje 0, ponieważ chce równocześnie traktować ten stos jako stringa
}
void write()
{
// wypisuje zawartosc stosu
printf("%s\n",stos_baza);
}
void kombinacje1(int n, char* alfabet, int alfabet_len)
{
if (n<=0)
{
write();
return;
}
for (int i=0; i<alfabet_len; i++)
{
push(alfabet[i]);
kombinacje1(n-1, alfabet, alfabet_len);
pop();
}
}
/* sposob drugi - tylko dla binarnych */
// po prostu wypisuje kolejne liczby od 0 do (2^n)-1 w systemie binarnym
void kombinacje2(int n)
{
int max = 1<<n;
for (int i=0; i<max; i++)
{
/*konwersja na binarny*/
for (int j=n-1; j>=0; j--)
{
printf("%d",(i>>j)&1);
}
printf("\n");
}
}
int main()
{
printf("metoda 1 dla n=4:\n");
kombinacje1(4,"01",2);
printf("\nmetoda 2 dla n=4:\n");
kombinacje2(4);
return 0;
}
Super, działa, bardzo dziękuję za pomoc :)