Miniatura o zliczaniu rekurencyjnym

Transkrypt

Miniatura o zliczaniu rekurencyjnym
Miniatura 1
Zliczanie rekurencyjne
Andrzej Sendlewski
1. Wstęp
Z analizy testów konkursu „Kangur Matematyczny” z ostatnich kilkunastu lat wynika, że jego uczestnicy stykają się z problemami polegającymi na konieczności policzenia liczby obiektów w pewnym układzie,
którego rozmiar wyraża się parametrami liczbowymi (zobacz [4]). Wyznaczenie takiej liczby jest proste, gdy znamy wzór opisujący tę liczbę
jako funkcję od tych parametrów. Wtedy wystarczy podstawić do wzoru aktualne wartości parametrów i wykonać odpowiednie operacje. Ale
co mamy zrobić, gdy takiego wzoru nie umiemy napisać albo, co gorsza,
nie wiemy, że w ogóle można go napisać, a układ jest na tyle wielki, że
„ręczne” obliczenia sprawiają nam duże kłopoty?
Otóż, dla niektórych układów tego typu, można z powodzeniem zastosować postępowanie zwane rekurencją (w teorii numeracji zwane rekursją). Polega ono na rozważaniu układów o mniejszych rozmiarach
niż dany i ustaleniu zależności pomiędzy liczbami interesujących nas
obiektów w układzie wyjściowym przez liczby tychże obiektów w układach o mniejszych rozmiarach. Pozwala nam to redukować problem do
układów o coraz mniejszych rozmiarach, aż otrzymamy pewne układy początkowe, w których liczby interesujących nas obiektów są łatwe
do wyznaczenia, a tym samym – są nam znane. Jeśli opis zależności
jest kompletny, to w odwrotnym postępowaniu pozwoli nam to obliczyć liczbę obiektów w układzie wyjściowym. Metoda ta ma niestety
swoją wadę. Jest nią duża liczba operacji prowadzących do uzyskania
wyniku, gdyż musimy wyznaczyć odpowiednie liczby dla wszystkich
1
2
1. ZLICZANIE REKURENCYJNE
układów o mniejszych rozmiarach. Liczba ta niestety bardzo szybko
wzrasta wraz ze wzrostem rozmiaru układu. Dlatego metoda ta nabrała
znaczenia praktycznego dopiero w dobie upowszechnienia komputerów
(pracochłonność została zrzucona na komputer) i jest obecnie jedną z
ważnych metod algorytmicznych (zobacz [3]).
W niniejszej miniaturze chcemy wprowadzić Czytelnika w opisaną
metodę rekurencji na konkretnych przykładach wzorowanych głównie
na zadaniach ze wspomnianego na początku konkursu „Kangur Matematyczny”.
2. Liczby figuralne
Na początek przedstawimy kilka prostych zadań dotyczących układów figur geometrycznych, które wprowadzą nas w istotę rekurencji.
Zadanie 1 (liczby kwadratowe). Rysujemy kolejne kwadraty o bokach długości całkowitej i dzielimy je na kwadraty jednostkowe (rysunek 1). Z ilu kwadratów jednostkowych składa się kwadrat o boku
długości n?
1
2
3
4
Rysunek 1. Kolejne kwadraty
Rozwiązanie. Oczywiście każdy z Czytelników odpowie natychmiast, że z n2 i . . . to jest doskonała odpowiedź! Ale nie ma tu myślenia rekurencyjnego. Spróbujmy odkryć jaka jest zależność pomiędzy
sąsiednimi kwadratami.
Z obserwacji kwadratów na rysunku 2 wnioskujemy, że n–ty kwadrat
powstaje z kwadratu (n−1)-szego przez dodanie 2(n − 1) + 1 = 2n − 1
kwadratów jednostkowych (zaznaczonych na rysunku 2 czerwonym kolorem).
2. LICZBY FIGURALNE
1
3
2
3
4
Rysunek 2. Kolejne kwadraty
A więc, jeśli przez k(n) oznaczymy liczbę kwadratów jednostkowych,
tworzących n–ty kwadrat, to prawdziwy jest wzór:
k(n) =
(
1, jeżeli n = 1;
k(n − 1) + 2n − 1, jeżeli n > 0.
Wzór ten pozwala nam obliczać wartości k(n) dla danego n, ale
pod jednym warunkiem: że policzymy wartości k(m) dla wszystkich
liczb m < n. A więc:
k(n) = (. . . (((1 + 3) + 5) + 7) + . . .) + 2n − 1,
co po uwzględnieniu naszej początkowej uwagi prowadzi do równości
2
.
1 + 3 + 5 + 7 + . . . + 2n − 1 = n Zadanie 2 (liczby trójkątne). Z monet o tych samych nominałach
układamy kolejne „trójkąty równoboczne”, takie jak na rysunku 3. Jaka
jest wartość monet tworzących n–ty trójkąt?
1
2
4
3
Rysunek 3. Kolejne „trójkąty” równoboczne
4
1. ZLICZANIE REKURENCYJNE
Rozwiązanie. Oczywiście, aby obliczyć wartość monet tworzących
n–ty trójkąt, wystarczy znać liczbę monet tworzących ten trójkąt. Niech
t(n) oznacza poszukiwaną liczbę monet tworzących n–ty trójkąt.
1
2
3
4
Rysunek 4. Kolejne „trójkąty” równoboczne
Patrząc na rysunek 4 stwierdzamy, że n–ty trójkąt powstaje z trójkąta (n − 1)-szego przez dodanie n monet (monety te zaznaczono czerwonym kolorem). Stąd mamy następujące zależności:
t(n) =
(
1, jeżeli n = 1;
t(n − 1) + n, jeżeli n > 1.
Wzór ten pozwala nam obliczać wartości t(n), dla danego n, ale
wymaga to obliczenia wszystkich wartości t(m) dla m < n.
Aby napisać jawny wzór na obliczanie wartości t(n), tj. rozwiązać
równanie rekurencyjne z zadania, wystarczy zsumować kolejne liczby
naturalne od 1 do n.
1
2
3
4
Rysunek 5. Inna reprezentacja liczb kwadratowych
W tym celu można skorzystać z wzoru na n wyrazów ciągu arytmetycznego. My natomiast postąpimy inaczej. Spróbujemy zbadać zależności pomiędzy liczbami kwadratowymi i trójkątnymi. Otóż, jeśli na
2. LICZBY FIGURALNE
5
rysunku 1 każdy mały kwadrat zastąpimy monetą, a potem te monety poprzesuwamy, to otrzymamy reprezentację liczb kwadratowych za
pomocą „rombów” z rysunku 5. Romby te możemy podzielić na dwa
kolejne trójkąty równoboczne, jak na rysunku 6, albo na dwa identyczne
trójkąty równoboczne i „przekątną”, jak na rysunku 7.
1
2
3
Rysunek 6
4
1
2
3
Rysunek 7
4
Z obserwacji figur na rysunku 6, otrzymujemy dla n > 1 równość:
k(n) = t(n) + t(n − 1) .
Natomiast z obserwacji figur na rysunku 7, dla n > 1, mamy:
k(n + 1) = 2t(n) + n + 1 .
Wyznaczając t(n) z ostatniego wzoru otrzymujemy:
t(n) =
czyli:
k(n + 1) − (n + 1)
(n + 1)2 − (n + 1)
=
,
2
2
n(n + 1)
t(n) =
.
2
6
1. ZLICZANIE REKURENCYJNE
Zadanie 3 (liczby tetraedralne). Z jednakowych sześciennych klocków budujemy kolejne piramidy trójkątne, jak na rysunku 8. Z ilu sześciennych klocków zbudowana jest n–ta piramida trójkątna?
1
2
3
4
Rysunek 8. Kolejne piramidy trójkątne
Rozwiązanie. Zależność rekurencyjną łatwo odczytujemy z rysunn(n + 1)
ku 9. Żółta ściana n–tej piramidy zbudowana jest z t(n) =
2
klocków. A więc, jeśli oznaczymy przez pt(n) liczbę klocków, z których
1
2
3
4
Rysunek 9
zbudowana jest n–ta piramida, to mamy:
1, jeżeli n = 1;
pt(n) =
n(n
+
1)
 pt(n − 1) +
, jeżeli n > 1.
2
Obliczając wartości pt(n), dla n = 1, 2, . . . , 12, otrzymujemy:


n
1 2 3 4 5 6 7
8
9
10 11 12
pt(n) 1 4 10 20 35 56 84 120 165 220 286 364
2. LICZBY FIGURALNE
7
Zadanie 4. Z jednakowych sześciennych klocków budujemy kolejne piramidy („kwadratowe”), jak na rysunku 10. Z ilu sześciennych
klocków zbudowana jest n–ta piramida?
1
2
3
4
Rysunek 10. Kolejne piramidy
Rozwiązanie. Zależność rekurencyjna jest łatwa do ustalenia (patrz
rysunek 11). Jeśli oznaczymy przez p(n) liczbę klocków, z których zbu-
1
2
3
4
Rysunek 11
dowana jest n–ta piramida, to mamy:
p(n) =
(
1, jeżeli n = 1;
p(n − 1) + n2 , jeżeli n > 1.
Licząc wartości p(n), dla n = 1, 2, . . . 12, otrzymujemy:
n 1 2 3 4 5 6
7
8
9
10 11 12
p(n) 1 5 14 30 55 91 140 204 285 385 506 650
Postępując podobnie jak postąpiliśmy w przypadku rozwiązywania
równania rekurencyjnego dla liczb trójkątnych, z jedną drobną różnicą,
8
1. ZLICZANIE REKURENCYJNE
że miejsce liczb kwadratowych zastąpimy liczbami sześciennymi (kolejne sześciany zbudowane z jednakowych klocków sześciennych), można
dość łatwo wyprowadzić wzór:
czyli:
n(n + 1)(2n + 1)
p(n) =
,
6
n(n + 1)(2n + 1)
12 + 22 + 32 + . . . + n2 =
.
6
3. Liczby Fibonacci’ego
Klasyczny ciąg Fibonacci’ego zdefiniowany jest następująco:



0, jeżeli n = 0;
1, jeżeli n = 1;
f ib(n) = 
 f ib(n − 2) + f ib(n − 1), jeżeli n > 1.
Rozwiązaniem tej rekurencji jest wzór Bineta:
!
1
(−1)
f ib(n) = √ ϕn −
,
ϕn
5
√
1+ 5
gdzie liczba ϕ =
jest złotym stosunkiem (zobacz [1]).
2
Wiele zadań na zliczanie często prowadzi do ciągu Fibonacci’ego
albo różnych jego uogólnień. W tym paragrafie zajmiemy się właśnie
takimi przykładami.
n
Zadanie 5. Na taras wieży widokowej prowadzą schody o n stopniach. Piotr wbiega na taras wykonując losowo kroki co 1 albo co 2
stopnie. Na ile sposobów Piotr może przebiec schody?
Rozwiązanie. Piotr przebiegnie schody, gdy osiągnie stopień n.
Niech s(n) oznacza liczbę wszystkich możliwych sposobów osiągnięcia
n–tego stopnia. Możliwe postępowanie Piotra ilustruje rysunek 12.
Aby Piotr mógł się znaleźć na stopniu o numerze 1, to musi to zrobić
na jeden sposób, wykonując krok „długości” 1 (zielona strzałka), więc
s(1) = 1. Na drugi stopień może on dotrzeć na 2 sposoby: wykonując
3. LICZBY FIBONACCI’EGO
9
dwa kroki długości 1 albo wykonując jeden krok długości 2 (czerwona
strzałka); czyli s(2) = 2.
+2
+1
n
n−2
+1
+2
+1
n−1
3
2
1
0
Rysunek 12. Schody
Rozważmy teraz dowolny stopień o numerze n > 2. Jak osiągnąć
stopień n? Otóż stopień ten może być osiągnięty na dwa sposoby: albo
ze stopnia o numerze n−1 za pomocą kroku długości 1, albo ze stopnia o
numerze n−2 za pomocą kroku długości 2. Liczba sposobów osiągnięcia
n–tego stopnia w pierwszym przypadku jest równa liczbie sposobów
osiągnięcia stopnia (n − 1), tj. s(n − 1). Zaś w drugim liczbie sposobów
osiągnięcia stopnia (n − 2), tj. s(n − 2). Stąd s(n) = s(n − 2) + s(n − 1).
Zatem pełen opis rekurencyjny jest następujący:



1, jeżeli n = 1;
2, jeżeli n = 2;
s(n) =

 s(n − 2) + s(n − 1), jeżeli n > 2.
Zadanie 6. Mamy pokryć prostokątny pas podłogi o wymiarach
n × 2 prostokątnymi płytami o wymiarach 2 × 1. (Płyt nie możemy
łamać.) Na ile sposobów możemy to zrobić?
Rozwiązanie. Zauważmy, że zadanie jest wykonalne dla wszelkich
naturalnych n. Umówmy się, że płyty układane poziomo będziemy zaznaczać kolorem zielonym, a płyty układane pionowo kolorem żółtym.
10
1. ZLICZANIE REKURENCYJNE
Najpierw ustalmy liczbę sposobów ułożenia płyt dla prostokątów o długościach n równych: 1, 2 i 3. Wszystkie możliwe pokrycia takich prostokątów przedstawiono na rysunku 13. Widzimy, że dla n = 1 mamy
1
2
2
3
Rysunek 13. Przypadki n = 1, 2, 3
3
jeden sposób, a dla n = 2 i n = 3 po dwa sposoby. Rozważmy teraz
prostokąt o długości n > 3. Mogą wystąpić dwie sytuacje: układanka
kończy się jednym prostokątem żółtym albo kończy się dwoma prostokątami zielonymi (patrz rysunek 14). W pierwszym przypadku liczba
n−1
1
Rysunek 14
n−2
2
sposobów pokrycia prostokąta długości n jest równa liczbie sposobów
pokrycia prostokąta długości (n−1), zaś w drugim liczbie sposobów pokrycia prostokąta długości (n − 2). Tym samym, oznaczając przez s(n)
(celowo przyjmujemy to samo oznaczenie co w poprzednim zadaniu!)
poszukiwaną liczbę sposobów pokrycia prostokąta długości n, mamy
następującą zależność rekurencyjną:



1, jeżeli n = 1;
2, jeżeli n = 2;
s(n) =

 s(n − 2) + s(n − 1), jeżeli n > 2.
Zadanie 7. Ile jest sposobów zdobycia n punktów w meczu koszykówki przez jedną z drużyn?
Rozwiązanie. Niech l(n) będzie liczbą sposobów uzyskania n punktów. Punkty w meczu koszykówki zdobywane są rzutami do kosza za:
3. LICZBY FIBONACCI’EGO
11
1 (tzw. rzuty osobiste), 2, albo 3 (z większej odległości) punkty. Wynik n = 1 można osiągnąć tylko na jeden sposób; wynik n = 2 na
dwa sposoby: 1 + 1, 2; a wynik n = 3 na cztery sposoby sposoby:
1 + 1 + 1, 1 + 2, 2 + 1, 3. Załóżmy teraz, że n > 3. Wynik ten można
osiągnąć na trzy sposoby (patrz rysunek 15).
+3
+2
+1
n
n−3 n−2 n−1
Rysunek 15. Sposoby osiągnięcia wyniku n
Z przeprowadzonego rozumowania otrzymujemy następującą zależność rekurencyjną:
1,
2,
l(n) =

4,



l(n − 3) + l(n − 2) + l(n − 1),





jeżeli
jeżeli
jeżeli
jeżeli
n = 1;
n = 2;
n = 3;
n > 3.
Wartości l(n), dla n = 1, 2, . . . 12, przedstawia poniższa tabela:
n 1 2 3 4 5 6 7 8
9
10 11 12
l(n) 1 2 4 7 13 24 44 81 149 274 504 927
Zadanie 8 (por. Junior 2010, pytanie 30). Pasek kodu kreskowego
tworzą na przemian kreski czarne i białe. Kod ten zawsze zaczyna się
i kończy czarną kreską. Każda z kresek (czy to czarna, czy biała) ma
grubość 1 albo 2 (patrz rysunek 16). Ile jest pasków długości n o różnych
kodach (kody zawsze czytamy od lewej do prawej strony)?
n
Rysunek 16. Przykład kodu
12
1. ZLICZANIE REKURENCYJNE
Rozwiązanie. Niech L(n) oznacza liczbę różnych kodów długości n. Wtedy oczywiście:
L(1) = 1, L(2) = 1, L(3) = 1 i L(4) = 3 .
Niech n będzie większe niż 4. Jak wyznaczyć liczbę L(n) za pomocą
liczb L(m) dla m < n? Tym razem nie wystarczy uwzględnić jaką
kreską kończy się kod; trzeba także uwzględnić jaką kreską się zaczyna.
Mamy cztery możliwe przypadki przedstawione na rysunku 17.
n−3
n−3
n
n
Rysunek 17. Możliwe cztery przypadki
n−2
n
n−4
n
Rozważmy kolejno każdy z tych przypadków.
a) Jeżeli kod zaczyna i kończy się kreskami grubości 1, to aby
uzyskać kod długości n, trzeba wypełnić przestrzeń długości
n − 2 kodem zaczynającym i kończącym się białymi kreskami.
Liczba takich kodów jest oczywiście równa L(n − 2) (bo liczba
kodów będzie taka sama, gdy zamienimy kolory).
Analogicznie w pozostałych trzech przypadkach.
b) Jeżeli kod zaczyna się kreską grubości 1, a kończy kreską grubości 2, to liczba takich kodów jest równa L(n − 3).
c) Jeżeli kod zaczyna się kreską grubości 2, a kończy kreską grubości 1, to liczba takich kodów jest także równa L(n − 3).
d) Jeżeli kod zaczyna się i kończy kreskami grubości 2, to liczba
takich kodów jest równa L(n − 4).
Stąd otrzymujemy:
L(n) = L(n − 2) + 2 · L(n − 3) + L(n − 4) .
Wykorzystując otrzymany wzór rekurencyjny, obliczamy kolejne wyrazy ciągu L(n). Dla n = 1, 2, . . . , 13 mamy:
n
1 2 3 4 5 6 7 8 9 10 11 12 13
L(n) 1 1 1 3 4 6 11 17 27 45 72 116 189
4. ZBIORY
13
4. Zbiory
Zbiory są najprostszymi strukturami i można je badać za pomocą
relacji przynależności elementu do zbioru. Pokażemy tutaj, że do zliczania liczby zbiorów o wskazanych własnościach rekurencja także może
być przydatna.
Zadanie 9. Zbiór X ma n elementów. Ile jest różnych podzbiorów
zbioru X o k elementach?
Dowód. Zauważmy, że jeśli k > n, to nie istnieje żaden podzbiór
zbioru X o k elementach. Załóżmy więc, że 0 6 k 6 n. Niech C(n, k)
oznacza liczbę wszystkich k–elementowych podzbiorów zbioru X. Ponieważ jedynym zbiorem o 0 elementach jest zbiór pusty, a jedynym
podzbiorem zbioru X o n elementach jest zbiór X, to dla dowolnych n:
C(n, 0) = 1 i C(n, n) = 1 .
Niech 1 < k < n. Ustalmy element x ∈ X. Jeżeli Y jest k–
elementowym podzbiorem zbioru X, to albo x ∈
/ Y , albo x ∈ Y (patrz
rysunek 18). Podzbiorów k–elementowych zbioru X, do których x nie
x
x
Y
Y
x∈
/Y
Rysunek 18
x∈Y
należy jest tyle, ile jest k–elementowych podzbiorów zbioru X \ {x},
czyli dokładnie C(n − 1, k). Natomiast podzbiorów k–elementowych
zbioru X, do których x należy jest tyle, ile jest (k − 1)–elementowych
podzbiorów zbioru X \ {x} , czyli C(n − 1, k − 1). Bo każdy z nich
można otrzymać przez dołączenie elementu x do dowolnie wybranego
(k − 1)–elementowego podzbioru zbioru X \ {x}. Stąd otrzymujemy
równość:
C(n, k) = C(n − 1, k − 1) + C(n − 1, k) .
14
1. ZLICZANIE REKURENCYJNE
Z ustalonych zależności łatwo obliczamy kolejne wartości C(n, k):
nk
0
1
2
3
4
5
6
7
8
9
10
0 1
1
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
2
3
4
5
6
7
8
9 10
1
3
1
6
4
1
10 10
5
1
15 20 15
6
1
21 35 35 21
7
1
28 56 70 56 28
8 1
36 84 126 126 84 36 9 1
45 120 210 252 210 120 45 10
1
Trójkąt liczb z tabeli zwany jest trójkątem Pascala. Liczby n–tego
wiersza tabeli są kolejnymi współczynnikami w rozwinięciu wyrażenia
(a + b)n , dokładniej prawdziwa jest równość:
(a + b)n =
n
X
k=0
C(n, k)ak bn−k .
Liczbę C(n, k) często oznacza się symbolem nk , który nazywany
jest symbolem Newtona. Nadmieńmy jeszcze, że można udowodnić równość (zobacz [2]):
n!
C(n, k) =
.
k! · (n − k)!
Zadanie 10. Danych jest n różnokolorowych kredek. Kredki te rozkładamy do k jednakowych (nierozróżnialnych) pudełek tak, że w każdym z tych pudełek znajdzie się przynajmniej jedna kredka. Na ile
sposobów możemy to zrobić?
Rozwiązanie. Niech X oznacza zbiór kredek. Każde rozłożenie
kredek do k pudełek powoduje rozbicie zbioru X na k niepustych podzbiorów X1 , X2 , . . . , Xk , co w języku teorii zbiorów możemy zapisać
następująco:
4. ZBIORY
15
a) Xi ⊂ X, dla każdego i = 1, 2, . . . , k,
b) Xi 6= ∅, dla każdego i = 1, 2, . . . , k,
c) X = X1 ∪ X2 ∪ . . . ∪ Xk .
Każdą rodzinę zbiorów {X1 , X2 , . . . , Xk } spełniającą powyższe warunki
nazywamy rozkładem zbioru X na k klas (każde Xi to klasa).
Zatem nasze zadanie polega na wyznaczeniu liczby wszystkich rozkładów zbioru n elementowego na k klas. Oznaczmy poszukiwaną liczbę
przez S(n, k).
Oczywiście, jeśli k > n, to żądany rozkład jest niemożliwy. Załóżmy
więc, że 1 6 k 6 n. Gdy k = 1, to jedyną klasą musi być cały zbiór X,
więc:
S(n, 1) = 1 .
Podobnie, gdy k = n, to jedynym rozkładem jest rodzina zbiorów jednoelementowych {{z}; z ∈ X}, więc:
S(n, n) = 1 .
Niech 1 < k < n. Ustalmy element x ∈ X. Jeżeli weźmiemy dowolny
rozkład zbioru X na k klas, to albo {x} jest klasą tego rozkładu, albo
{x} nie jest klasą tego rozkładu (patrz rysunek 19). Rozkładów zbioru
x
klasa {x}
k − 1 klas
k klas
x
X
Rysunek 19
X \ {x}
X na k klas, w których {x} jest klasą jest tyle, ile jest rozkładów zbioru
X \ {x} na k − 1 klas, czyli S(n − 1, k − 1). Natomiast każdy rozkład
zbioru X na k klas, w których {x} nie jest klasą można zrealizować
16
1. ZLICZANIE REKURENCYJNE
następująco: wziąć dowolny rozkład zbioru X \ {x} na k klas i dołączyć
element x do jednej dowolnie wybranej spośród tych klas. Przeto liczba
takich rozkładów jest równa k · S(n − 1, k). Stąd otrzymujemy równość:
S(n, k) = S(n − 1, k − 1) + k · S(n − 1, k) .
Z ustalonych zależności łatwo obliczamy kolejne wartości S(n, k):
nk
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8 9 10
1
1
1
1
3
1
1
7
6
1
1 15
25
10
1
1 31
90
65
15
1
1 63 301
350
140
21
1
1 127 966 1701 1050
266
28
1
1 255 3025 7770 6951 2646 462 36 1
1 511 9330 34105 42525 22827 5880 750 45 1
W literaturze matematycznej liczby S(n, k) zwane są liczbami Stirlinga drugiego rodzaju (zobacz [2]).
Zadanie 11. Siedmiu kierowców ma pięcioma samochodami pojechać do pewnej miejscowości. Ile jest różnych możliwości rozmieszczenia
kierowców w samochodach?
Rozwiązanie. Rozmieszczenie 7 kierowców w 5 samochodach definiuje funkcję ze zbioru kierowców „na” zbiór samochodów (żaden samochód nie odjedzie bez kierowcy). Zatem ile jest takich funkcji? Aby
taką funkcję zdefiniować należy wziąć rozkład zbioru 7 kierowców na 5
klas, co można uczynić na S(7, 5) sposobów. Mając rozkład, wszystkim
elementom klasy przyporządkowujemy ten sam samochód, przy czym
elementom różnych klas różne samochody, co możemy zrobić na 5! sposobów. Zatem liczba poszukiwanych funkcji (z uwzględnieniem wartości
z tabeli) jest równa 5! · S(7, 5) = 120 · 140.
5. ŚCIEżKI W GRAFACH
17
5. Ścieżki w grafach
W tym paragrafie zajmiemy się przykładami zliczania ścieżek w
grafach zorientowanych.
Zadanie 12 (por. Junior 2007, pytanie 23). Równoramienny trójkąt prostokątny o przyprostokątnych długości całkowitej n dzielimy na
trójkąty prostokątne o przyprostokątnych równych 1 (patrz przykład
dla n = 5 na rysunku 20).
B
A
Rysunek 20. Przykład dla n = 5
Na ile sposobów możemy przejść z końca A przeciwprostokątnej do
jej końca B, poruszając się po bokach małych trójkątów prostokątnych
zgodnie z kierunkiem strzałek według schematu
?
Rozwiązanie. Jeśli naniesiemy wszystkie strzałki zgodnie ze sche(n + 1)(n + 2)
matem, to otrzymamy graf zorientowany o t(n + 1) =
2
wierzchołkach. Umieśćmy ten graf w układzie współrzędnych, tak jak
na rysunku 21. Mamy wyznaczyć liczbę wszystkich ścieżek w tym grafie
prowadzących od punktu A = (0, 0) do punktu B = (n, n). Rozwiążmy
18
1. ZLICZANIE REKURENCYJNE
zadanie pozornie nieco ogólniejsze. Spróbujmy wyznaczyć liczbę ścieżek kończących się w dowolnym punkcie o współrzędnych (n, k), dla
dowolnych n i k takich że, 0 6 k 6 n.
5
y
B = (5, 5)
4
3
2
1
x
A = (0, 0)
1
2
3
4
Rysunek 21
5
Niech d(n, k) oznacza liczbę wszystkich ścieżek w grafie prowadzących od punktu A = (0, 0) do punktu P = (n, k). Mamy następujące
trzy istotnie różne możliwości osiągnięcia punktu P zależne od jego
współrzędnej k. Musimy osobno rozważyć przypadki: k = 0, k = n
oraz 1 6 k < n. Przypadki te ilustruje rysunek 22.
(n, n)
(n − 1, 0)
(n, 0)
(n − 1, n − 1)
(n, n − 1)
(n − 1, k)
(n − 1, k − 1)
(n, k)
(n, k − 1)
Rysunek 22
Stąd mamy następujące zależności rekurencyjne pomiędzy poszukiwanymi liczbami:
5. ŚCIEżKI W GRAFACH
a) jeżeli k = 0, to d(0, 0) = 0
b) jeżeli k = 1, to d(1, 1) = 2
19
oraz d(n, 0) = 1 dla n > 0;
oraz:
d(n, 1) = d(n, 0) + d(n − 1, 0) + d(n − 1, 1) ,
dla n > 1;
c) jeżeli 1 < k < n, to:
d(n, k) = d(n, k − 1) + d(n − 1, k − 1) + d(n − 1, k) ;
d) jeżeli k = n, to:
czyli:
d(n, k) = d(n, k − 1) + d(n − 1, k − 1) ,
d(n, n) = d(n, n − 1) + d(n − 1, n − 1) .
Obliczanie wartości d(n, k) dla większych liczb n i k jest dość kłopotliwe, gdyż wymaga wykonania dość dużej liczby operacji (złożoność
obliczeniowa problemu jest duża). Jednakże niezbędne obliczenia możemy wykonać przy pomocy komputera. W tym celu, wystarczy ustalone
zależności rekurencyjne zapisać w języku programowania. Napiszmy taką procedurę w języku PASCAL.
Function d(n,k:LongInt):LongInt;
begin
if k=0 then
begin
if n=0 then d:=0;
if n>0 then d:=1;
end {k=0}
else if k=1 then
begin
if n=1 then d:=2;
if n>1 then d:=d(n,k-1)+d(n-1,k-1)+d(n-1,k)
end {k=1}
else if k<n then d:=d(n,k-1)+d(n-1,k-1)+d(n-1,k)
else d:=d(n,k-1)+d(n-1,k-1) {k>1}
end;
20
1. ZLICZANIE REKURENCYJNE
Początkowe wartości d(n, k), obliczone przy użyciu tej procedury
zawiera tabela:
nk
0
1
2
3
4
5
6
7
8
9
10
0
1
2
3
4
5
6
7
8
9
10
0
1
1
1
1
1
1
1
1
1
1
2
4
6
8
10
12
14
16
18
20
6
16
30
48
70
96
126
160
198
22
68
146
264
430
652
938
1296
90
304
714
1408
2490
4080
6314
394
1412
3534
7432
14002
24396
1806
6752
17718
39152
77550
8558
33028
89898
206600
41586
164512
461010
206098
831620
1037718
Z tabeli odczytujemy, że liczba różnych ścieżek prowadzących z punktu
A do punktu B w grafie z rysunku 20, tj. d(5, 5), jest równa 394.
Zadanie 13 (por. Junior 2006, pytanie 30). W meczu piłki ręcznej
drużyna gospodarzy objęła prowadzenie i utrzymała je do stanu n : k.
Na ile sposobów mogły padać bramki w tym meczu do tego momentu?
Rozwiązanie. Zilustrujmy możliwy przebieg meczu do stanu n : k,
n > k, za pomocą grafu zorientowanego. Wynikowi x : y przyporządy
5
(6, 5)
4
3
2
1
x
O
2
3
4
5
6
1
Rysunek 23. Graf przebiegu meczu
kujmy punkt kratowy o współrzędnych (x, y), a punkty (x, y) łączymy
5. ŚCIEżKI W GRAFACH
21
strzałkami z punktami (u, v), gdy wynik u : v jest możliwym wynikiem
bezpośrednio po wyniku x : y. Graf taki dla n = 6 i k = 5 przedstawia
rysunek 23.
Liczba możliwości zdobywania bramek przez obie drużyny do stanu
n : k zgodnie z warunkami zadania jest równa liczbie ścieżek w grafie prowadzących od punktu O = (0, 0) do punktu o współrzędnych
(n, k). Oznaczmy tę liczbę przez w(n, k). Posługując się grafem z rysunku 23, spróbujmy opisać zależności rekurencyjne pomiędzy poszukiwanymi liczbami. Mamy:
a) jeżeli k = 0, to w(0, 0) = 0 oraz w(n, 0) = 1 , dla n > 0;
b) jeżeli k = 1, to w(2, 1) = 1 oraz:
w(n, 1) = w(n, 0) + w(n − 1, 1) ,
dla n > 2;
c) jeżeli 1 < k < n − 1, to:
w(n, k) = w(n, k − 1) + w(n − 1, k) ;
d) jeżeli k = n − 1, to:
czyli:
w(n, k) = w(n, k − 1) ,
w(n, n − 1) = w(n, n − 2) .
Wartości w(n, k) w dość wąskim zakresie zebrano poniżej w tabeli:
nk
0
1
2
3
4
5
6
7
8
9
10
0
1
2
3
4
5
6
7
8
9
10
11
0
1
1
1
1
1
1
1
1
1
1
1
1
2
3
4
5
6
7
8
9
10
2
5
9
14
20
27
35
44
54
5
14
28
48
75
110
154
208
14
42
90
165
275
429
637
42
132
297
572
1001
1638
132
429
1001
2002
3640
429
1430
3432
7072
1430
4862
11934
4862
16796
16796
Z tabeli możemy odczytać, że przykładowy wynik 6 : 5 można uzyskać
na 42 sposoby.
22
1. ZLICZANIE REKURENCYJNE
Większe wartości można obliczać przy pomocy programu komputerowego, wykorzystującego ustalony opis rekurencyjny. Oto kilka przykładów otrzymanych tym sposobem:
w(20, 15) = 463991880,
w(20, 16) = 811985790,
w(20, 17) = 1289624490,
w(20, 18) = 1767263190,
w(20, 19) = 1767263190.
6. Zadania do samodzielnego rozwiązania
Zadanie 14. Rysujemy kolejne trójkąty równoboczne o bokach długości całkowitej i dzielimy je na trójkąty równoboczne o boku 1 (rysunek 24).
2
3
4
1
Rysunek 24. Kolejne trójkąty równoboczne
a) Z ilu trójkątów o boku długości 1 składa się trójkąt o boku długości n?
b) Ile jest wszystkich trójkątów równobocznych na n–tym rysunku?
c) Ile jest wszystkich rombów na n–tym rysunku?
Zadanie 15. Na ile sposobów można pokryć prostokąt o wymiarach
n × 3, prostokątami o wymiarach 2 × 1?
Zadanie 16. Liczba a jest iloczynem n parami różnych liczb pierwszych p1 , p2 , . . . , pn . Ile jest możliwych przedstawień liczby a w postaci
iloczynów liczb całkowitych większych od 1 (iloczyny różniące się porządkiem czynników uważamy za takie same)?
Zadanie 17. Ile jest wszystkich rozkładów dodatniej liczby całkowitej n w sumę dodatnich składników całkowitych nie większych niż
LITERATURA
23
ustalona dodatnia liczba całkowita k? Rozkłady różniące się porządkiem składników uważamy za takie same.
Zadanie 18. W meczu koszykówki drużyna gości pierwsza zdobyła
punkty i nie przegrywała tego meczu do stanu n : k. Na ile sposobów
mogły być zdobywane punkty w tym meczu do tego momentu?
Literatura
[1] Richard. A. Dunlap, The Golden Ratio and Fibonacci Numbers, World Scientific, Singapore 1998.
[2] Jürgen Flachsmeyer, Kombinatoryka. Podstawowy wykład w ujęciu mnogościowym, PWN, Warszawa 1977.
[3] Maciej M. Sysło, Piramidy, szyszki i inne konstrukcje algorytmiczne WSiP,
Warszawa 2000.
[4] Matematyka z wesołym kangurem (Testy z rozwiazaniami kategorii Kadet i
Junior z lat 1991-2009), Aksjomat, Toruń 2009.