Liczba możliwych podziałów zbioru n-elementowego na k niepustych (parami rozłącznych) podzbiorów nazywana jest liczbą Stirlinga drugiego rodzaju. Zwykle oznaczana jest przed dużą literę S tj. S(n, k).
Dla n > 0 przyjmuje się, że S(n, 1) = S(n, n) = 1, S(n, k) = 0 k > n, S(0, 0) = 1 oraz S(n, 0) = 0.
Do obliczania dowolnego wyrazu służy wzór rekurencyjny S(n, k) = S(n - 1, k - 1) + k·S(n - 1, k).
Zazwyczaj podczas podawania zbioru liczb można podać ciąg, który można z nich utworzyć. Ze względu na zależność od dwóch zmiennych bardziej wygodne jest zapisanie ciągu w postaci trójkąta.
n | k | ||||||||||||||
0 | |||||||||||||||
1 | 1 | 1 | |||||||||||||
2 | 0 | 1 | 2 | ||||||||||||
3 | 0 | 1 | 1 | 3 | |||||||||||
4 | 0 | 1 | 3 | 1 | 4 | ||||||||||
5 | 0 | 1 | 7 | 6 | 1 | 5 | |||||||||
6 | 0 | 1 | 15 | 25 | 10 | 1 | 6 | ||||||||
7 | 0 | 1 | 31 | 90 | 65 | 15 | 1 | 7 |
W celu wyliczenia wartości pola należy pobrać wartość do góry na prawo i pomnożyć przez numer pozycji w wierszu i do tej wartości dodać pole do góry po lewo. Jeśli pole z którego ma zostać pobrana wartość nie istnieje to pobrana wartość wynosi 0.
Wzór rekurencyjny należy zaimplementować tłumacząc wzór w sposób dosłowny. W tym jednak przypadku warunków w rekurencji jest znacznie więcej niż w przypadku typowej rekurencji. Przykładowa implementacja wygląda następująco:
(1.) Funkcja przyjmuje dwa argumenty o wartościach nieujemnych i (2. - 5.) sprawdzane są warunki stopu. Jeśli żaden warunek nei zostanie spełniony to (6.) zwracana jest wartość zgodnie ze wzorem rekurencyjnym.
Posiadając funkcję stirlingII() istnieje możliwość wyświetlenia trójkątu Stirlinga przy pomocy poniższej funkcji main():
Warto jednak zauważyć, że jest to mało efektywne metoda, ponieważ każdy kolejny wiersz możnaby wyliczyć znacznie szybciej polegając na poprzednim wierszu. W tym przypadku jednak każdy wyraz jest wyliczany od nowa za każdym razem.
Zasada tworzenia trójkąta Stirlinga jest bardzo podobna do trójkąta Pascala. Różni się jedynie mnożeniem jednego z czynników przy pomocy wartości k. Nie przeszkadza to jednak, aby wyliczać następny wiersz na podstawie poprzedniego.
Poniżej został zamieszczony kod wyznaczający kolejne wiersze trójkąta i wypisujące je od razu na ekran:
(2.) Zanicjalizuj tablicę takiej długości, aby zmieścił się ostatni wiersz oraz dwa wyrazy pomocnicze 0. (3. - 5.) Określ postać pierwszego rzędu i (6.) wypisz go w sposób zapisany na stałe (upraszcza do dalszy kod). (7.) Dla każdego kolejnego wiersza: (8. - 10.) wylicz kolejny wiersz polegając na poprzednich wartościach. Ze względu na to, że dane są wpisywane do tablicy na podstawie której generowane są kolejne wiersze to należy wyliczać kolejne pola od prawej do lewej. (11.) Po wyliczeniu nowego wiersza należy ustalić kolejny nieustawiony element na tablicy na 0 (upraszcza to kod sumowanie, bo nie trzeba rozpatrywać przypadku, gdy pobierany element nie istnieje - w tym przypadku istnieje i wynosi 0). W każdej iteracji (12. - 15.) wypisz wiersz. Na koniec po zakończeniu wyliczania kolejnych wierszy (17.) usuń tablicę.
W celu przetestowania działania funkcji można skorzystać z poniższej funkcji main(). W tym przypadku wypisane zostaną pierwsze 8 wierszy trójkąta Stirlinga.
Popraw kod wypisujący trójkąta Stirlinga tak, aby każdy wiersz został wyśrodkowany.