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

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Pitab (dyskusja | edycje)
Nie podano opisu zmian
 
Pitab (dyskusja | edycje)
Linia 4: Linia 4:


* nieformalnie - taka definicja, która odwołuje się do samej siebie<br>
* nieformalnie - taka definicja, która odwołuje się do samej siebie<br>
- ale trzeba tu uważać, by odwołanie było do instancji o mniejszej komplikacji,
  - ale trzeba tu uważać, by odwołanie było do instancji o mniejszej komplikacji,


* zwykle chodzi o ciąg <math>\left\langle a_0, a_1, a_2, a_3, \ldots \right\rangle</math>, <br>
* zwykle chodzi o ciąg <math>\left\langle a_0, a_1, a_2, a_3, \ldots \right\rangle</math>, <br>
- dla którego przepis na element <math>a_n</math> wykorzystuje jaki(e)ś poprzedni(e) element(y): <math>a_{n-1}, a_{n-2}, \ldots</math> itp.,
  - dla którego przepis na element <math>a_n</math> wykorzystuje jaki(e)ś poprzedni(e) element(y): <math>a_{n-1}, a_{n-2}, \ldots</math> itp.,


* początkowy element (lub kilka początkowych) muszą być zadane konkretnie -  
* początkowy element (lub kilka początkowych) muszą być zadane konkretnie -  
Linia 38: Linia 38:




<center><math>\aligneds_0 &=& 1
<center><math>\aligned s_0 &=& 1
\\
\\
s_{n} &=& n \cdot s_{n-1} \mbox{\ \ \ dla \ } n\geq 1.  
s_{n} &=& n \cdot s_{n-1} \mbox{\ \ \ dla \ } n\geq 1.  
Linia 47: Linia 47:




<center><math>\aligneds_0 &=& 1
<center><math>\aligned s_0 &=& 1
\\
\\
s_1 &=& 1 \cdot s_{0} = 1 \cdot 1 = 1
s_1 &=& 1 \cdot s_{0} = 1 \cdot 1 = 1
Linia 67: Linia 67:




<center><math>\aligneds_0 &=& 0
<center><math>\aligned s_0 &=& 0
\\
\\
s_{n} &=& n \cdot s_{n-1} \mbox{\ \ \ dla \ } n\geq 1
s_{n} &=& n \cdot s_{n-1} \mbox{\ \ \ dla \ } n\geq 1
Linia 76: Linia 76:




<center><math>\aligneds_0 &=& \frac{1}{2}
<center><math>\aligned s_0 &=& \frac{1}{2}
\\
\\
s_{n} &=& n \cdot s_{n-1} \mbox{\ \ \ dla \ } n\geq 1
s_{n} &=& n \cdot s_{n-1} \mbox{\ \ \ dla \ } n\geq 1
Linia 85: Linia 85:




<center><math>\aligneds_0 &=& 1
<center><math>\aligned s_0 &=& 1
\\
\\
s_{n} &=& n \cdot s_{n-2} \mbox{\ \ \ dla \ } n\geq 2.
s_{n} &=& n \cdot s_{n-2} \mbox{\ \ \ dla \ } n\geq 2.
Linia 101: Linia 101:




<center><math>\aligneds_0 &=& 0
<center><math>\aligned s_0 &=& 0
\\
\\
s_{n} &=&  s_{n-1}+2  \mbox{\ \ \ dla \ } n\geq 1
s_{n} &=&  s_{n-1}+2  \mbox{\ \ \ dla \ } n\geq 1
Linia 151: Linia 151:




<center><math>\aligneds_0 &=& 1
<center><math>\aligned s_0 &=& 1
\\
\\
s_{n} &=&  2\cdot s_{n-1}  \mbox{\ \ \ dla \ } n\geq 1
s_{n} &=&  2\cdot s_{n-1}  \mbox{\ \ \ dla \ } n\geq 1
Linia 246: Linia 246:


* najpierw przenosimy dwa górne krążki na iglicę <math>B</math> posługując się iglicą <math>C</math>:
* najpierw przenosimy dwa górne krążki na iglicę <math>B</math> posługując się iglicą <math>C</math>:


<center><math>A\rightarrow C, \ \  A\rightarrow B, \ \ C\rightarrow B
<center><math>A\rightarrow C, \ \  A\rightarrow B, \ \ C\rightarrow B
</math></center>
</math></center>


* przenosimy największy krążek z <math>A</math> na <math>C</math>:
* przenosimy największy krążek z <math>A</math> na <math>C</math>:


<center><math>A\rightarrow C
<center><math>A\rightarrow C
</math></center>
</math></center>


* przenosimy krążki z <math>B</math> na <math>C</math> posługując się iglicą <math>A</math>:
* przenosimy krążki z <math>B</math> na <math>C</math> posługując się iglicą <math>A</math>:


<center><math>B\rightarrow A, \ \ B\rightarrow C, \ \ A\rightarrow C
<center><math>B\rightarrow A, \ \ B\rightarrow C, \ \ A\rightarrow C
</math></center>
</math></center>


co pokazuje, że potrzeba tu 7 ruchów.<br>
co pokazuje, że potrzeba tu 7 ruchów.<br>
Linia 271: Linia 265:




<center><math>\alignedH_1 &=& 1
<center><math>\aligned H_1 &=& 1
\\
\\
H_2 &=& 3
H_2 &=& 3
Linia 282: Linia 276:


* przenosimy <math>n-1</math> górnych krążków na iglicę <math>B</math> posługując się iglicą <math>C</math><br>
* przenosimy <math>n-1</math> górnych krążków na iglicę <math>B</math> posługując się iglicą <math>C</math><br>
- potrzeba na to <math>H_{n-1}</math> ruchów
  - potrzeba na to <math>H_{n-1}</math> ruchów


* przenosimy największy krążek z <math>A</math> na <math>C</math><br>
* przenosimy największy krążek z <math>A</math> na <math>C</math><br>
- to tylko jeden ruch
  - to tylko jeden ruch


* przenosimy <math>n-1</math> krążków z <math>B</math> na <math>C</math> posługując się iglicą <math>A</math><br>
* przenosimy <math>n-1</math> krążków z <math>B</math> na <math>C</math> posługując się iglicą <math>A</math><br>
- znów potrzeba na to <math>H_{n-1}</math> ruchów
  - znów potrzeba na to <math>H_{n-1}</math> ruchów


A zatem  
A zatem  
Linia 302: Linia 296:




<center><math>\alignedH_1 &=& 1
<center><math>\aligned H_1 &=& 1
\\
\\
H_{n} &=&  2\cdot H_{n-1}+1  \mbox{\ \ \ dla \ } n\geq 2
H_{n} &=&  2\cdot H_{n-1}+1  \mbox{\ \ \ dla \ } n\geq 2
Linia 335: Linia 329:




<center><math>\aligneda_0&=&2,\\
<center><math>\aligned a_0&=&2,\\
a_{n+1}&=&a_n^2.
a_{n+1}&=&a_n^2.
\endaligned</math></center>
\endaligned</math></center>
Linia 372: Linia 366:




<center><math>\alignedl_0&=&1,\\
<center><math>\aligned l_0&=&1,\\
l_{n+1}&=&l_n+n.
l_{n+1}&=&l_n+n.
\endaligned</math></center>
\endaligned</math></center>
Linia 380: Linia 374:




<center><math>\alignedl_n&=&l_{n-1}+n=l_{n-2}+(n-1)+n=l_{n-3}+(n-2)+(n-1)+n=\ldots\\
<center><math>\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},
&=&l_0+1+2+\ldots+n=1+\frac{n(n+1)}{2},
\endaligned</math></center>
\endaligned</math></center>

Wersja z 11:04, 19 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 jaki(e)ś poprzedni(e) element(y): 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} \mbox{\ \ \ dla \ } 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} \mbox{\ \ \ dla \ } 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} \mbox{\ \ \ dla \ } 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} \mbox{\ \ \ dla \ } n\geq 2. \endaligned}


W ostatnim przypadku widać, że ponieważ odwołanie jest Parser nie mógł rozpoznać (nieznana funkcja „\mathsl”): {\displaystyle \mathsl{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 \mbox{\ \ \ dla \ } 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. Parser nie mógł rozpoznać (nieznana funkcja „\mathsl”): {\displaystyle \mathsl 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 \mbox{\ \ 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} \mbox{\ \ \ dla \ } 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. Parser nie mógł rozpoznać (nieznana funkcja „\mathsl”): {\displaystyle \mathsl 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 \mbox{\ \ 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.

{}{0.9pt}

(400,125)

(49,15)(150,0){3}{(2,100)[cc]{

(50,10){(0,0)[tc]{A}} (200,10){(0,0)[tc]{B}} (350,10){(0,0)[tc]{C}} (0,15){(1,0){100}} (2,19){(1,0){96}} (4,23){(1,0){92}} (6,27){(1,0){88}} (8,31){(1,0){84}} (10,35){(1,0){80}} (12,39){(1,0){76}} (14,43){(1,0){72}} (16,47){(1,0){68}} (18,51){(1,0){64}} (20,55){(1,0){60}} (22,59){(1,0){56}}

(42,78){(0,0)[cc]{}} (58,78){(0,0)[cc]{}}

(40,97){(1,0){20}} (42,101){(1,0){16}} (44,105){(1,0){12}} (46,109){(1,0){8}}

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 \mbox{\ \ \ dla \ } 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