Myślę, że możesz ustawić to za pomocą rekursji.
Zainspirował mnie następującej tożsamości:
choose(n,k) = choose(n-1,k-1) + choose(n-1,k)
więc zdefiniować funkcję F (n, k), który wytwarza żądany sekwencję (tj sekwencja binarnych ciągów o długości n z dokładnie bitów k ustawione tak, że kolejne ciągi różnią się dwoma bitami).
Po pierwsze, zauważ, że możemy zmienić kolejność kolumn F (n, k) w dowolny sposób, jaki nam się podoba i wyprodukować kolejny, równie ważny, F (n, k).
Powyższa tożsamość sugeruje, że budujemy F (n, k) za pomocą F (n-1, k-1) i F (n-1, k). Niech A będzie ciągiem uzyskanym przez zmianę kolejności kolumn F (n-1, k-1), tak aby ostatni ciąg kończył się w k-1 1
s, a następnie dodawanie do każdego z nich 1
. Niech B będzie ciągiem uzyskanym przez zmianę kolejności kolumn F (n-1, k) tak, aby pierwszy ciąg zakończył się k 1
s, a następnie dodano do każdego z nich 0
. Wtedy F (n, k) jest po prostu połączeniem A i B. Wynikiem jest poprawny F (n, k), jako wewnętrzny dla A i B ciągi różnią się dwoma bitami, a ostatni ciąg A i pierwszy ciąg B różni się dwoma bitami (k + 1 do ostatniego i ostatni bit).
Pokażę przykład używając n = 5, k = 2. Otrzymujemy przez rekursji następujące dwie sekwencje F:
F(4,1): 0001
0010
0100
1000
F(4,2): 0011
0101
1001
1010
0110
1100
Aby dokonać, zamienić pierwszą i ostatnią kolumnę F (4,1) i dodać 1
do siebie:
A: 10001
00101
01001
00011
dokonać B brak swapy kolumna jest konieczne, tak, że wystarczy dodać 0
każdym rzędzie F, (4,2):
B: 00110
01010
10010
10100
01100
11000
to F (5,2) jest tylko połączeniem a i B.
Jeśli jest to praca domowa, należy odpowiednio oznaczyć. i co masz na myśli przez n \ choose k? – Rndm
@shg nie, to nie jest praca domowa. ;) i przez n \ choose k Mam na myśli liczbę kombinacji k (współczynnik dwumianowy). – ushik