Matematyka dyskretna 1/Wykład 2: Rekurencja: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Pitab (dyskusja | edycje)
Idziak (dyskusja | edycje)
Linia 365: Linia 365:




<center><math>\begin{array} {c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c}
<center><math>\begin{array} {|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}
\hline
n&0&1&2&3&4&5&6&7&8&9&10&11&12&13&14\\
n&0&1&2&3&4&5&6&7&8&9&10&11&12&13&14\\
\hline
\hline
0&1&1&2&3&5&8&13&21&34&55&89&144&233&377&610
0&1&1&2&3&5&8&13&21&34&55&89&144&233&377&610
\hline
\end{array}  
\end{array}  
</math></center>
</math></center>

Wersja z 17:49, 21 sie 2006

Definicje rekurencyjne

Definicja rekurencyjna (indukcyjna):

  • nieformalnie - taka definicja, która odwołuje się do samej siebie - ale trzeba tu uważać, by odwołanie było do instancji o mniejszej komplikacji,
  • zwykle chodzi o ciąg a0,a1,a2,a3,, - dla którego przepis na element an wykorzystuje jakieś poprzednie elementy: an1,an2, itp.,
  • początkowy element (lub kilka początkowych) muszą być zadane konkretnie - żeby było od czego zacząć,
  • zwykle definicja rekurencyjna odwołuje się do jednego lub kilku poprzednich elementów, ale może też odwoływać się do wszystkich poprzednich.

Przykład

Silnia liczby n (zapisywana jako n!) to iloczyn kolejnych liczb naturalnych od 1 do n, czyli


n!=n(n1)21.


Przyjmuje się że 0!=1. Oto wartości silni dla kilku początkowych liczb naturalnych


n012345678n!112624120720504040320


Ciąg 0!,1!,2!,3!,4!, aby mógł być precyzyjnie rozumiany np. przez komputer, powinien być zadany rekurencyjnie jako:


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned s_0 &=& 1 \\ s_{n} &=& n \cdot s_{n-1} \quad \textnormal{dla} \quad n\geq 1. \endaligned}


Ponieważ pierwszy wyraz jest zadany, to możemy kolejno obliczać:


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned s_0 &=& 1 \\ s_1 &=& 1 \cdot s_{0} = 1 \cdot 1 = 1 \\ s_2 &=& 2 \cdot s_{1} = 2 \cdot 1 = 2 \\ s_3 &=& 3 \cdot s_{2} = 3 \cdot 2 = 6 \\ s_4 &=& 4 \cdot s_{3} = 4 \cdot 6 = 24 \\ \ldots \endaligned}


Przykład

Jaki ciąg jest zdefiniowany poprzez małą modyfikację w definicji silni?


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned s_0 &=& 0 \\ s_{n} &=& n \cdot s_{n-1}\quad \textnormal{dla}\quad n\geq 1 \endaligned}


A co definiują następujące określenia:


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned s_0 &=& \frac{1}{2} \\ s_{n} &=& n \cdot s_{n-1} \quad \textnormal{dla}\quad n\geq 1 \endaligned}


oraz


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned s_0 &=& 1 \\ s_{n} &=& n \cdot s_{n-2} \quad \textnormal{dla}\quad n\geq 2. \endaligned}


W ostatnim przypadku widać, że ponieważ odwołanie jest dwa wyrazy wstecz, to już wyliczenie pierwszego wyrazu s1 staje się niemożliwe.

Ciąg arytmetyczny

Przykład

W ciągu zadanym poprzez równania:


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned s_0 &=& 0 \\ s_{n} &=& s_{n-1}+2 \quad \textnormal{dla}\quad n\geq 1 \endaligned}


łatwo rozpoznać kolejne liczby parzyste:


sn=2n.


Ogólnie ciąg zadany poprzez ustalenie a0 oraz


an=an1+r


to tzw. ciąg arytmetyczny.
Jego n-ty wyraz dany jest wzorem:


an=a0+nr.


Aby to uzasadnić, pokazujemy indukcyjnie, że:


Parser nie mógł rozpoznać (błąd składni): {\displaystyle a_0 + 0\cdot r = a_0 \quad\textnormal{jest rzeczywiście zerowym wyrazem ciągu} }


oraz


a0+nr=(a0+(n1)r)+r=an1+r=an

Ciąg geometryczny

Przykład

W ciągu zadanym poprzez równania:


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned s_0 &=& 1 \\ s_{n} &=& 2\cdot s_{n-1} \quad \textnormal{dla}\quad n\geq 1 \endaligned}


łatwo rozpoznać kolejne potęgi liczby 2:


sn=2n.


Ogólnie ciąg zadany poprzez ustalenie a0 oraz zadanie


an=qan1


to tzw. ciąg geometryczny.
Jego n-ty wyraz dany jest wzorem:


an=a0qn.


Aby to uzasadnić, pokazujemy indukcyjnie, że:


Parser nie mógł rozpoznać (błąd składni): {\displaystyle a_0 \cdot q^0 = a_0 \cdot 1 = a_0 \quad\textnormal{jest rzeczywiście zerowym wyrazem ciągu} }


oraz


a0qn=(a0qn1)q=an1q=an.

Wieże Hanoi

Przykład (E.Lucas, 1883)

U zarania czasu Bóg umieścił 64 złote krążki na jednej z trzech diamentowych iglic tak, że krążki wyżej umieszczone miały mniejsze promienie.

rys.wieże Hanoi-3 krażki

Następnie Bóg polecił grupie mnichów przełożenie tych krążków na trzecią iglicę (C), ale tak by:

  • w jednym ruchu przenosić tylko jeden krążek,
  • krążek większy nigdy nie może leżeć na krążku mniejszym,
  • można posługiwać się iglicą B.

Mnisi pracują od zarania dziejów dzień i noc ... .Ile czasu im to zajmie?

Wieże Hanoi - analiza

By obliczyć ilość potrzebnych do wykonania ruchów, przeanalizujmy najpierw małe przypadki:
Łatwo zauważyć, że dla 1 krążka potrzebny jest jeden ruch: AC
Podobnie dla dwu krążków możemy postąpić: AB,  AC,  BC
Przy 3 krążkach postępujemy tak:

  • najpierw przenosimy dwa górne krążki na iglicę B posługując się iglicą C:
AC,  AB,  CB
  • przenosimy największy krążek z A na C:
AC
  • przenosimy krążki z B na C posługując się iglicą A:
BA,  BC,  AC

co pokazuje, że potrzeba tu 7 ruchów.
Czy już wiesz jak rozwiązać to zadanie w ogólności (dla n krążków)?
Oznaczmy przez Hn liczbę ruchów potrzebnych do przeniesienia n krążków z jednej iglicy na drugą. Wiemy już, że:


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned H_1 &=& 1 \\ H_2 &=& 3 \\ H_3 &=& 7 \endaligned}


Aby przenieść n krążków z A na C możemy postąpić podobnie jak w przypadku 3 krążków, redukując zadanie do:

  • przenosimy n1 górnych krążków na iglicę B posługując się iglicą C - potrzeba na to Hn1 ruchów
  • przenosimy największy krążek z A na C - to tylko jeden ruch
  • przenosimy n1 krążków z B na C posługując się iglicą A - znów potrzeba na to Hn1 ruchów

A zatem


Hn=Hn1+1+Hn1=2Hn1+1


Ile wobec tego wynosi H64?

Mamy więc równanie rekurencyjne


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned H_1 &=& 1 \\ H_{n} &=& 2\cdot H_{n-1}+1 \quad \textnormal{dla}\quad n\geq 2 \endaligned}


bardzo podobne do ciągu geometrycznego.
Możemy policzyć kilka jego wyrazów:


1,  3,  7,  15,  31,  63,  127,


i rozpoznać w nim ciąg potęg dwójki zmniejszonych o 1.

Ale czy rzeczywiście Hn=2n1?

I znów, aby się upewnić, że nasze odgadnięcie było poprawne, sprawdzamy indukcyjnie, że


2Hn1+1=2(2n11)+1=22n12+1=2n1=Hn


co oznacza, że rzeczywiście ciąg 2n1 spełnia równanie rekurencyjne, którym zadany jest ciąg Hn.
A wiec H64=2641100000000000000000000, co przy przenoszeniu jednego krążka na sekundę zajmie ponad 3000000000000 lat, a przenosząc te krążki "komputerem" 3GHz potrzeba będzie... i tak ponad tysiąc lat!

Przykład

{{{3}}}

Przykład

Jaka jest największa możliwa liczba ln obszarów wyznaczonych przez n prostych na płaszczyźnie?

Sprawdźmy najpierw kilka pierwszych wartości.

  • Gdy nie ma żadnej prostej obszar jest jeden.
  • Jedna prosta tworzy zawsze dwa różne obszary.
  • Kładąc drugą prostą (byle nie równoległą do pierwszej) otrzymujemy 4 obszary.

W tym momencie możemy pokusić się o zgadywanie i przypuścić, że ln=2n. Jednakże

  • Dla trzech prostych jest to 7.

Rysunek: Rys. 1.5 Szkic na kartce

Zauważmy, że nowa prosta zwiększa ilość obszarów o k jeśli przecina dokładnie k1 z poprzednich prostych i to w nowych punktach przecięć. Z drugiej strony dwie proste mogą się przeciąć w co najwyżej jednym punkcie i przecinają się o ile nie są równolegle. Widzimy zatem, że najwięcej obszarów dostaniemy kładąc kolejne proste w ten sposób aby żadne dwie nie były równoległe i żadne trzy nie przecinały się w jednym punkcie. Otrzymujemy następujące równanie rekurencyjne:


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned l_0&=&1,\\ l_{n+1}&=&l_n+n. \endaligned}


Ponownie rozwiążemy równanie rozwijając je:


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned l_n&=&l_{n-1}+n=l_{n-2}+(n-1)+n=l_{n-3}+(n-2)+(n-1)+n=\ldots\\ &=&l_0+1+2+\ldots+n=1+\frac{n(n+1)}{2}, \endaligned}


gdzie ostatnia równość wynika z - już udowodnionego - wzoru na sumę kolejnych liczb naturalnych.

Liczby Fibonacciego

foto, notka

Spośród ciągów zdefiniowanych rekurencyjnie, jednym z najsłynniejszych jest ciąg Fibonacciego {fi} i zadany przez


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned f_0&=&0,\\ f_1&=&1,\\ f_{n+2}&=& f_n+f_{n+1}. \endaligned}


Wszystkie wyrazy ciągu, oprócz pierwszych dwu, są sumą dwu poprzednich elementów. Oto kilka pierwszych wartości ciągu Fibonacciego:


Parser nie mógł rozpoznać (nieznana funkcja „\begin{array}”): {\displaystyle \begin{array} {|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|} \hline n&0&1&2&3&4&5&6&7&8&9&10&11&12&13&14\\ \hline 0&1&1&2&3&5&8&13&21&34&55&89&144&233&377&610 \hline \end{array} }


  • Jak odgadnąć wzór na ogólny wyraz ciągu?
  • Jeśli nie można odgadnąć, to jak oszacować szybkość wzrostu tego ciągu?
  • Czy rośnie on wielomianowo czy raczej wykładniczo?

Pierwsze pytanie - póki co - wydaje się dość beznadziejne.

Przykład

Na ile sposobów można ułożyć domina na prostokącie o rozmiarze 2×n?

rys.prostokat-kratka 2xn

Oznaczmy, tę liczbę przez dn w zależności od n.

  • Dla n=1 jest to możliwe na dokładnie jeden sposób, tzn. d1=1
     Rysunek: 1.6 Szkic na kartce
  • Dla n=2 są już dwa takie sposoby:

- ustawiamy obie kostki poziomo, lub obie pionowo,
a zatem d2=2.

     Rysunek: 1.7 Szkic na kartce
  • Dla n=3 są trzy sposoby,
     Rysunek: 1.8 Szkic na kartce
  • Pokrywając większy prostokąt 2×n musimy jakoś pokryć dwa skrajne pola przylegające do krótszej krawędzi o długości 2. Można to zrobić na dwa sposoby:
    • ułożyć jedno domino pionowo - pozostanie prostokąt 2×(n1), który można pokryć na dn1 sposobów,
    • ułożyć dwa domina poziomo - pozostanie prostokąt 2×(n2), który można pokryć na dn2 sposobów.

Czyli łącznie jest dn=dn1+dn2 sposobów pokrycia tablicy 2×n.

Rozpoznajemy w tym łatwo ciąg Fibonacci'ego dn=fn+1 (bo oczywiście pusty prostokąt 2×0 można pokryć na dokładnie jeden sposób, d0=0).

Obserwacja 2.1

f0+f1++fn=fn+21.

Dowód

Polecamy jako ćwiczenie bardzo łatwy dowód powyższej równości przez indukcję. Przedstawimy alternatywny dowód posługujący się intuicją z poprzedniego przykładu. Wiemy zatem, że prostokąt wielkości 2×n można pokryć kostkami domina na fn+1 sposobów.

Dla dowodu obserwacji, policzmy na ile sposobów można ułożyć prostokąt wielkości 2×(n+1) w taki sposób aby było tam chociaż jedno domino ustawione poziomo. Policzymy to dwiema różnymi metodami:

  • Jest tylko jedna metoda ułożenia prostokąta 2×(n+1) bez poziomych klocków. A zatem jest fn+21 sposobów ułożenia prostokąta 2×(n+1) z chociaż jednym dominem poziomym.
  • Rozważmy kolejne możliwe miejsca pierwszego poziomego domina (tak naprawdę pary domin) w prostokącie 2×(n+1) od lewej:
    • jeśli na samym początku jest para poziomych domin, to pozostaje prostokąt 2×(n1), który możemy wypełnić dowolnie na fn sposobów;
    • jeśli na początku jest i (gdzie 0in) pionowych domin, a potem następuje para poziomych, to pozostaje prostokąt 2×(ni1), który można wypełnić na fni sposobów;
     Rysunek: 1.10 Szkic na kartce
    • para poziomych domin może się pojawić najdalej po i=n1 pionowych dominach

To dowodzi, iż jest dokładnie fn+fn1++f0 sposobów ułożenia prostokąta (n+1)×2 z chociaż jednym dominem poziomym.

Policzyliśmy na dwa różne sposoby to samo, otrzymując obie strony postulowanej równości. To kończy dowód.

Obserwacja 2.2

f02+f12++fn2=fnfn+1.

Rysunek: Rys. 1.11 Szkic na kartce

Dowód

Dowód przez indukcję po n:

  • dla n=0 mamy f02=0=f0f1,
  • do założonej indukcyjnie równości f02+f12++fk2=fkfk+1 dodajmy obustronnie fk+12 otrzymując


f02+f12++fk2+fk+12=fkfk+1+fk+12=fk+1(fk+fk+1)=fk+1fk+2,


co kończy dowód kroku indukcyjnego.

Twierdzenie 2.3 [wzór Eulera-Bineta]

fn=15[(1+52)n(152)n].


Dowód

Rozważmy równanie:


f2f1=0.


Mnożąc je obustronnie przez xn otrzymujemy:


fn+2=fn+1+fn.


Oznacza to, że jeśli x jest pierwiastkiem równania f2f1=0, to ciąg fn=xn spełnia zależność rekurencyjną Fibonacci'ego:


fn+2=fn+fn+1.


Tyle, że równanie ma dwa rzeczywiste rozwiązania:


x1=1+52          x2=152.


Który więc z ciągów x1n,x2n jest ciągiem Fibonacci'ego? Okazuje się, że żaden, bo na przykład ilorazy kolejnych wyrazów ciągu Fibonacci'ego nie są stałe, a takie musiałyby być dla ciągów geometrycznych x1n,x2n. Co więcej:

  • jeśli ciąg an spełnia zależność fn+2=fn+1+fn, to dla dowolnej liczby rzeczywistej α ciąg αan też spełnia tę zależność,
  • jeśli ciągi an i bn spełniają zależność fn+2=fn+1+fn, to ich suma an+bn też spełnia tę zależność.

Oznacza to w szczególności, że zbiór F ciągów spełniających zależność fn+2=fn+1+fn jest podprzestrzenią wektorową przestrzeni .

Ćwiczenie

Przestrzen F jest dwuwymiarowa o bazie φ,1φ

Przypuśćmy na chwilę, że jakaś kombinacja liniowa ciągów x1n,x2n, tzn.


c1x1n+c2x2n


jest poszukiwanym ciągiem Fibonacci'ego. Aby wyznaczyć stałe c1,c2 zauważmy, że muszą one spełniać układ równań:


f0=c1+c2       f1=c1x1+c2x2


co po rozwiązaniu daje:


Parser nie mógł rozpoznać (nieznana funkcja „\alignedc”): {\displaystyle \alignedc_1 &=& \frac{f_1 - f_0x_2}{x_1-x_2}= \frac{1}{\frac{1+\sqrt{5}}{2}-\frac{1-\sqrt{5}}{2}} =\frac{1}{\sqrt{5}} \\ c_2 &=& \frac{f_1 - f_0x_1}{x_2-x_1}= \frac{1}{\frac{1-\sqrt{5}}{2}-\frac{1+\sqrt{5}}{2}} =-\frac{1}{\sqrt{5}} \endaligned}


i ostatecznie dostajemy ciąg:


F(n)=15[(1+52)n(152)n],


jako potencjalnego kandydata na ciąg Fibonacci'ego. W istocie potrzebujemy indukcyjnego dowodu, że F(n)=fn. Dla wygody oznaczmy φ=1+52.

  • Ponieważ liczby Fibonacci'ego są zadane wzorem odwołującym się

do dwóch poprzednich elementów sprawdzamy dwie pierwsze wartości:

    • F(0)=15φ015(1φ)0=1515=0=f0,
    • F(1)=15φ15(1φ)=15(21+521)=1=f1,
  • Aby pokazać, że F(k+2)=fk+2 użyjemy pod koniec naszych obliczeń założenia indukcyjnego, że F(k+1)=fk+1 i F(k)=fk, a także tego, że zarówno φ jak i 1varphi spełniają zależność xk+2=xk+1+xk:


Parser nie mógł rozpoznać (nieznana funkcja „\alignedF”): {\displaystyle \alignedF(k+2)&=&\frac{1}{\sqrt{5}}\varphi^{k+2}-\frac{1}{\sqrt{5}}(1-\varphi)^{k+2}\\ &=&\frac{1}{\sqrt{5}}(\varphi^{k}+\varphi^{k+1})-\frac{1}{\sqrt{5}}((1-\varphi)^{k}+(1-\varphi)^{k+1})\\ &=&\frac{1}{\sqrt{5}}(\varphi^{k}-(1-\varphi)^{k})+\frac{1}{\sqrt{5}}(\varphi^{k+1}-(1-\varphi)^{k+1})\\ &=&F(k)+F(k+1)\\ &=&f_k+f_{k+1}\\ &=&f_{k+2}. \endaligned}


Liczba φ=1+52 jest powszechnie znana jako złota liczba. Opisuje ona tak zwane złote proporcje w sztuce. Pojawia się ona również bardzo często przy okazji różnych obiektów kombinatorycznych. Występuje również w kolejnym wniosku, który po raz pierwszy zaobserwował Johannes Kepler.

foto, notka


Wniosek 2.4


limnfn+1fn=φ.


Dowód


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned\lim_{n\rightarrow\infty}\frac{f_{n+1}}{f_n}&=&\lim_{n\rightarrow\infty}\frac{\frac{1}{\sqrt{5}}(\varphi^{n+1}-(1-\varphi)^{n+1})}{\frac{1}{\sqrt{5}}(\varphi^n-(1-\varphi)^n)}\\ &=&\lim_{n\rightarrow\infty}\frac{\frac{1}{\sqrt{5}}\varphi-\frac{1}{\sqrt{5}}(1-\varphi)(\frac{1-\varphi}{\varphi})^n}{\frac{1}{\sqrt{5}}-\frac{1}{\sqrt{5}}(\frac{1-\varphi}{\varphi})^n}\\ &=&\varphi, \endaligned}


gdzie ostatnia równość wynika z faktu, iż


limn(1φφ)n=0,


jako że |1φφ|<1.

Macierze liczb Fibonacci'ego

Rozważając specjalne kwadratowe macierze 2×2 liczb Fibonacci'ego postaci


[fn+2fn+1fn+1fn]


łatwo zauważamy, że


[fn+2fn+1fn+1fn][1110]=[fn+3fn+2fn+2fn+1].


Ponieważ równocześnie:


[f2f1f1f0]=[1110],


to łatwo indukcyjnie łatwo udowodnić, że


[fn+1fnfnfn1]=[1110]n.


Przyrównując wyznaczniki obu macierzy otrzymujemy tożsamość, którą jako pierwszy opublikował Jean-Dominique Cassini w 1680 roku.

foto, notka

Obserwacja 2.5

fn+1fn1fn2=(1)n.

Korzystając z kolei z faktu, że AmAn=Am+n dla dowolnej kwadratowej macierzy A, otrzymujemy:

Obserwacja 2.6


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned f_n^2+f_{n-1}^2&=&f_{2n-1},\\ f_{n+1}f_m+f_nf_{m-1}&=&f_{m+n}. \endaligned}


Rozwiązywanie liniowych równań rekurencyjnych - metoda ogólna

Rozumowanie dotyczące ciągu Fibonacci'ego możemy uogólnić. Chwilowo skupimy się jedynie na przypadku, gdy dla rozwiązania równania rekurencyjnego


sn=asn1+bsn2,


równanie kwadratowe


x2=ax+b


ma dokładnie dwa różne pierwiastki x1,x2. Wtedy bowiem łatwo pokazać, że ciąg


sn=c1x1n+c2x2n


ze stałymi


c1=s1s0x2x1x2        c2=s1s0x1x2x1


jest poszukiwanym rozwiązaniem.

Gdy równanie x2=ax+b ma tylko jeden pierwiastek x0 (podwójny, gdy a2=4b), to wkrótce pokażemy, że rozwiązaniem jest


sn=c1x0n+c2nx0n


ze stałymi wyznaczonymi, jak poprzednio, poprzez dwa pierwsze wyrazy początkowe:


c1=s0        c2=s1s0x0x0.

Drzewa binarne

Poznaliśmy wiele przykładów ciągów liczbowych zadanych równaniami rekurencyjnymi. Teraz poznamy zupełnie inną strukturę zadaną definicją rekurencyjną.

Drzewo binarne to dowolny obiekt powstały zgodnie z regułami:

  • jest drzewem binarnym,
  • jeśli T0 i T1 są drzewami binarnymi to T0T1 też jest drzewem binarnym.

Zbiór wszystkich drzew binarnych oznaczamy przez 𝕋. Wypisując konkretne drzewo binarne używamy nawiasów aby ujednoznacznic kolejność aplikacji reguł z definicji rekurencyjnej.

Przykład

Interpretacja graficzna kilku, małych drzew binarnych:

Rysunek: Rys 1.12 Szkic na kartce

Wielkość drzewa binarnego jest wyznaczona funkcją


𝕋T|T|


zdefiniowana rekurencyjnie (z uwagi na budowę drzewa) jako:

  • ||=1,
  • |T0T1|=|T0|+|T1|+1.

Szerokość drzewa binarnego jest wyznaczona funkcją


Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mathbb{T} \ni T \mapsto \mbox{\sf h}(T) \in \mathbb{N} }


zdefiniowana rekurencyjnie (z uwagi na budowę drzewa) jako:

  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf w}(\perp)=1} ,
  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf w}(T_0\wedge T_1)=\mbox{\sf w}(T_0)+\mbox{\sf w}(T_1)} .

Wysokość drzewa binarnego jest wyznaczona funkcją


Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mathbb{T} \ni T \mapsto \mbox{\sf h}(T) \in \mathbb{N} }


zdefiniowana rekurencyjnie (z uwagi na budowę drzewa) jako:

  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf h}(\perp)=0} ,
  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf h}(T_0\wedge T_1)=\max\left(\mbox{\sf h}(T_0),\mbox{\sf h}(T_1) \right)+1} .

Przykład

Rysunek: 1.13 Szkic na kartce


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned\left\vert(\perp\wedge(\perp\wedge\perp))\wedge(\perp\wedge\perp)\right\vert&=&\left\vert\perp\wedge(\perp\wedge\perp)\right\vert+\left\vert\perp\wedge\perp\right\vert+1\\ &=&(\left\vert\perp\right\vert+\left\vert\perp\wedge\perp\right\vert+1)+(\left\vert\perp\right\vert+\left\vert\perp\right\vert+1)+1\\ &=&(2+(\left\vert\perp\right\vert+\left\vert\perp\right\vert+1))+3+1\\ &=&9. \endaligned}


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned\mbox{\sf w}((\perp\wedge(\perp\wedge\perp))\wedge(\perp\wedge\perp)) &=&\mbox{\sf w}(\perp\wedge(\perp\wedge\perp))+\mbox{\sf w}(\perp\wedge\perp)\\ &=&(\mbox{\sf w}(\perp)+\mbox{\sf w}(\perp\wedge\perp))+(\mbox{\sf w}(\perp)+\mbox{\sf w}(\perp))\\ &=&(\mbox{\sf w}(\perp)+(\mbox{\sf w}(\perp)+\mbox{\sf w}(\perp))+(\mbox{\sf w}(\perp)+\mbox{\sf w}(\perp))\\ &=&5. \endaligned}


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned\mbox{\sf h}((\perp\wedge(\perp\wedge\perp))\wedge(\perp\wedge\perp)) &=&\max\left(\mbox{\sf h}(\perp\wedge(\perp\wedge\perp)),\mbox{\sf h}(\perp\wedge\perp) \right)+1\\ &=&\max\left(\max\left(\mbox{\sf h}(\perp),\mbox{\sf h}(\perp\wedge\perp) \right)+1,\max\left(\mbox{\sf h}(\perp),\mbox{\sf h}(\perp) \right)+1 \right)+1\\ &=&4. \endaligned}


Przykład

Obserwacja 2.7

Dla T=T0T1 mamy

  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf h}(T_i)<\mbox{\sf h}(T)} ,
  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf w}(T_i)<\mbox{\sf w}(T)} ,
  • |Ti|<|T|.

Wniosek 2.8

Drzewo jest jedynym drzewem o wysokości 0.

Twierdzenie 2.9 [Zasada Indukcji dla drzew binarnych]

Gdy S𝕋 jest zbiorem drzew binarnych spełniającym warunki:

  • S,
  • jeśli T0,T1S to T0T1S,

to S=𝕋.

Dowód

Dla dowodu niewprost załóżmy, że w S nie ma wszystkich drzew. Zatem zbiór S=𝕋S jest niepusty. Tym samym niepusty jest też zbiór Parser nie mógł rozpoznać (błąd składni): {\displaystyle Z={\left\{ {\mbox{\sf h}(T) : T \in S'} \right\}\ }} Na mocy założenia o S wiemy, że S, co wraz z Wnioskiem 2.8 implikuje, że 0Z.

Ponieważ Z jest niepusty, to na podstawie Zasady Minimum ma element najmniejszy, powiedzmy z. Wiemy już, że z>0. Niech TS poświadcza fakt, że zZ, tzn. Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf h}(T)=z>0} . Ponownie z Wniosku 2.8 dostajemy T, czyli T=T0T1 dla pewnych T1,T2. Z Obserwacji 2.7 mamy Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf h}(T_0)<\mbox{\sf h}(T)=z} oraz Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf h}(T_1)<\mbox{\sf h}(T)=z} . Zatem minimalność z w S0 daje Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf h}(T_0),\mbox{\sf h}(T_1)\notin Z} , czyli T0,T1S i w konsekwencji T0,T1S.

Ale wtedy, z założenia o zbiorze S, dostajemy T=T0T1=TS. Sprzeczność.

Zasada Indukcji dla drzew binarnych to przykład na to, że w strukturach zdefiniowanych rekurencyjnie można dowodzić przy pomocy zasady analogicznej do Zasady Indukcji. Poniżej przedstawiamy przykład używający tego narzędzia.

Obserwacja 2.10

Dla dowolnego drzewa binarnego T𝕋 mamy:

  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf h}(T) \le \mbox{\sf w}(T) \le \left\vert T\right\vert} ,
  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \left\vert T\right\vert=2\cdot\mbox{\sf w}(T)-1} .

Dowód

Niech S𝕋 będzie zbiorem drzew binarnych spełniających powyższe własności.

  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf h}(\perp)=0 \le 1 =\mbox{\sf w}(\perp)= \left\vert\perp\right\vert} , oraz Parser nie mógł rozpoznać (błąd składni): {\displaystyle \left\vert\perp\right\vert=1=2\mbox{\sf w}(\perp)-1} , czyli S.
  • W kroku indukcyjnym zakładamy, że T=T0T1 oraz że drzewa T0,T1 mają już opisane w Obserwacji własności. Wtedy


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned\left\vert T_0\wedge T_1\right\vert&=&\left\vert T_0\right\vert+\left\vert T_1\right\vert+1 =(2\mbox{\sf w}(T_0)-1)+(2\mbox{\sf w}(T_1)-1)+1\\ &=&2(\mbox{\sf w}(T_0)+\mbox{\sf w}(T_1))-1\\ &=&2\mbox{\sf w}(T_0\wedge T_1)-1. \endaligned}


Podobnie


Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned\mbox{\sf h}(T_0\wedge T_1) &=&\max\left(\mbox{\sf h}(T_0),\mbox{\sf h}(T_1) \right)+1 \\ &\leq & \max\left(\mbox{\sf w}(T_0),\mbox{\sf w}(T_1) \right)+1 \\ &\leq & \mbox{\sf w}(T_0)+\mbox{\sf w}(T_1) \\ &=& \mbox{\sf w}(T_0\wedge T_1), \endaligned}


gdzie ostatnia nierówność wynika bezpośrednio z faktu, że szerokość każdego drzewa wynosi co najmniej 1.