Matematyka dyskretna 1/Wykład 2: Rekurencja

Z Studia Informatyczne
Wersja z dnia 13:39, 3 paź 2021 autorstwa Luki (dyskusja | edycje) (Zastępowanie tekstu - "<div class="thumb t(.*)"><div style="width:(.*)px;"> <flashwrap>file=(.*).swf\|size=small<\/flashwrap> <div\.thumbcaption>(.*)<\/div><\/div> <\/div>" na "$2x$2px|thumb|$1|$4")
Przejdź do nawigacjiPrzejdź do wyszukiwania

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:


s0=1sn=nsn1dlan1.


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


s0=1s1=1s0=11=1s2=2s1=21=2s3=3s2=32=6s4=4s3=46=24


Przykład

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


s0=0sn=nsn1dlan1


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


s0=12sn=nsn1dlan1


oraz


s0=1sn=nsn2dlan2.


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:


s0=0sn=sn1+2dlan1


ł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:


a0+0r=a0jest 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:


s0=1sn=2sn1dlan1


ł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:


a0q0=a01=a0jest rzeczywiście zerowym wyrazem ciągu


oraz


a0qn=(a0qn1)q=an1q=an.

Wieże Hanoi

<flashwrap>file=Wieza hanoi.swf|size=small</flashwrap>

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.

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:


H1=1H2=3H3=7


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


H1=1Hn=2Hn1+1dlan2


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}}}
MD1-1.5.swf

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.

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:

l0=1,ln+1=ln+n.

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

ln=ln1+n=ln2+(n1)+n=ln3+(n2)+(n1)+n==l0+1+2++n=1+n(n+1)2,

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

Liczby Fibonacciego

Leonardo Fibonacci (1175-1250)
Zobacz biografię

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


f0=0,f1=1,fn+2=fn+fn+1.


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


n0123456789101112131401123581321345589144233377610


  • 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.

Plik:Domino-1.6-1.8.mp4
Domino-1.6-1.8.swf

Przykład

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

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
  • Dla n=2 są już dwa takie sposoby:

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

  • Dla n=3 są trzy sposoby,
  • 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=1).

Obserwacja 2.1

f0+f1++fn=fn+21.

<flash>file=MD1-1.10.swf|width=350|height=150</flash>

<div.thumbcaption>1.10

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;
    • 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.

AM1.M15.W.R01

Obserwacja 2.2

f02+f12++fn2=fnfn+1.

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:


c1=f1f0x2x1x2=11+52152=15c2=f1f0x1x2x1=11521+52=15


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:


F(k+2)=15φk+215(1φ)k+2=15(φk+φk+1)15((1φ)k+(1φ)k+1)=15(φk(1φ)k)+15(φk+1(1φ)k+1)=F(k)+F(k+1)=fk+fk+1=fk+2.


Jan Kepler (1571-1630)
Zobacz biografię

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.


Wniosek 2.4


limnfn+1fn=φ.


Dowód


limnfn+1fn=limn15(φn+1(1φ)n+1)15(φn(1φ)n)=limn15φ15(1φ)(1φφ)n1515(1φφ)n=φ,


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.


Giovanni Domenico Cassini (1625-1712)
Zobacz biografię

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


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


fn2+fn12=f2n1,fn+1fm+fnfm1=fm+n.


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ą.

<flash>file=MD1-1.12.swf|width=350|height=200</flash>

<div.thumbcaption>Interpretacja graficzna kilku, małych drzew binarnych

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.

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ą


𝕋Th(T)


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

  • w()=1,
  • w(T0T1)=w(T0)+w(T1).

Wysokość drzewa binarnego jest wyznaczona funkcją


𝕋Th(T)


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

  • h()=0,
  • h(T0T1)=max(h(T0),h(T1))+1.

<flash>file=MD1-1.13.swf|width=200|height=200</flash>

<div.thumbcaption>1-13

Przykład

|(())()|=|()|+||+1=(||+||+1)+(||+||+1)+1=(2+(||+||+1))+3+1=9.


w((())())=w(())+w()=(w()+w())+(w()+w())=(w()+(w()+w())+(w()+w())=5.


h((())())=max(h(()),h())+1=max(max(h(),h())+1,max(h(),h())+1)+1=4.


<flash>file=MD1-1.14.swf|width=350|height=250</flash>

<div.thumbcaption>1-14

Obserwacja 2.7

Dla T=T0T1 mamy

  • h(Ti)<h(T),
  • w(Ti)<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 Z={h(T):TS}  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. h(T)=z>0. Ponownie z Wniosku 2.8 dostajemy T, czyli T=T0T1 dla pewnych T1,T2. Z Obserwacji 2.7 mamy h(T0)<h(T)=z oraz h(T1)<h(T)=z. Zatem minimalność z w S0 daje h(T0),h(T1)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:

  • h(T)w(T)|T|,
  • |T|=2w(T)1.

Dowód

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

  • h()=01=w()=||, oraz ||=1=2w()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


|T0T1|=|T0|+|T1|+1=(2w(T0)1)+(2w(T1)1)+1=2(w(T0)+w(T1))1=2w(T0T1)1.


Podobnie


h(T0T1)=max(h(T0),h(T1))+1max(w(T0),w(T1))+1w(T0)+w(T1)=w(T0T1),


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