Matematyka dyskretna 1/Ćwiczenia 2: Rekurencja: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
m Zastępowanie tekstu – „ </math>” na „</math>”
Linia 35: Linia 35:




Przejdźmy więc do przypadku  <math>n\geq2 </math> .  
Przejdźmy więc do przypadku  <math>n\geq2</math> .  
Na mocy zależności rekurencyjnej otrzymujemy, że
Na mocy zależności rekurencyjnej otrzymujemy, że


Linia 69: Linia 69:
<math>a_n=2^n
<math>a_n=2^n
</math>  
</math>  
a następnie udowodnij to indukcyjnie ze względu na  <math>n </math> .
a następnie udowodnij to indukcyjnie ze względu na  <math>n</math> .
</div></div>
</div></div>


Linia 81: Linia 81:




Przejdźmy więc do przypadku  <math>n\geq2 </math> . Na mocy zależności rekurencyjnej otrzymujemy, że
Przejdźmy więc do przypadku  <math>n\geq2</math> . Na mocy zależności rekurencyjnej otrzymujemy, że




Linia 108: Linia 108:
<math>l_n = f_{n+1} + f_{n-1},
<math>l_n = f_{n+1} + f_{n-1},
</math>  
</math>  
gdzie  <math>f_n </math>  jest  <math>n </math> -tą liczbą Fibonacci'ego.  
gdzie  <math>f_n</math>  jest  <math>n</math> -tą liczbą Fibonacci'ego.  
(Dla precyzji obliczeń przyjmij, że  <math>f_{-1}=0</math> .)
(Dla precyzji obliczeń przyjmij, że  <math>f_{-1}=0</math> .)


Linia 114: Linia 114:


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">   
Zastosuj indukcję względem  <math>n </math> .
Zastosuj indukcję względem  <math>n</math> .
</div></div>
</div></div>


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
Dowód przeprowadzimy, indukcyjnie ze względu na  <math>n </math> . Dla wartości początkowych  <math>n=0,1 </math>  dostajemy odpowiednio, że
Dowód przeprowadzimy, indukcyjnie ze względu na  <math>n</math> . Dla wartości początkowych  <math>n=0,1</math>  dostajemy odpowiednio, że




Linia 126: Linia 126:




Przejdźmy więc do przypadku  <math>n\geq2 </math> . Na mocy zależności rekurencyjnej otrzymujemy, że
Przejdźmy więc do przypadku  <math>n\geq2</math> . Na mocy zależności rekurencyjnej otrzymujemy, że




Linia 149: Linia 149:


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">   
Załóżmy, że Marek ma pewność, że szukana liczba  <math>x </math>  znajduje się w przedziale  
Załóżmy, że Marek ma pewność, że szukana liczba  <math>x</math>  znajduje się w przedziale  
<math>\left[a,b\right]</math> .  
<math>\left[a,b\right]</math> .  
Po uzyskaniu odpowiedzi na pytanie,  
Po uzyskaniu odpowiedzi na pytanie,  
czy  <math>x </math>  jest większa niż  <math>\left\lfloor \left( a+b+1 \right)/2 \right\rfloor</math> ,  
czy  <math>x</math>  jest większa niż  <math>\left\lfloor \left( a+b+1 \right)/2 \right\rfloor</math> ,  
Marek zawęzi zbiór poszukiwań o połowę,   
Marek zawęzi zbiór poszukiwań o połowę,   
szukając później liczby  <math>x </math>  w przedziale  
szukając później liczby  <math>x</math>  w przedziale  
<math>\left[a,\left\lfloor \left( a+b-1 \right)/2 \right\rfloor\right]</math>  albo w przedziale  
<math>\left[a,\left\lfloor \left( a+b-1 \right)/2 \right\rfloor\right]</math>  albo w przedziale  
<math>\left[\left\lfloor \left( a+b+1 \right)/2 \right\rfloor,b\right]</math> .  
<math>\left[\left\lfloor \left( a+b+1 \right)/2 \right\rfloor,b\right]</math> .  
Linia 163: Linia 163:
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
Strategię Marka można przedstawić w następujący rekurencyjny sposób:
Strategię Marka można przedstawić w następujący rekurencyjny sposób:
* Jeśli szukana liczba  <math>x</math> jest z zakresu  <math>\left[a,b\right] </math>, gdzie <math>a=b</math>, to Marek wie, że szukana liczba to  <math>a </math> .
* Jeśli szukana liczba  <math>x</math> jest z zakresu  <math>\left[a,b\right]</math>, gdzie <math>a=b</math>, to Marek wie, że szukana liczba to  <math>a</math> .
* Jeśli szukana  <math>x</math>  liczba jest z zakresu  <math>\left[a,b\right] </math>, gdzie  <math>a<b</math>, to Marek zadaje pytanie, czy  <math>x\geq\left\lfloor \left( a+b+1 \right)/2 \right\rfloor</math>. Gdy Adam odpowie:
* Jeśli szukana  <math>x</math>  liczba jest z zakresu  <math>\left[a,b\right]</math>, gdzie  <math>a<b</math>, to Marek zadaje pytanie, czy  <math>x\geq\left\lfloor \left( a+b+1 \right)/2 \right\rfloor</math>. Gdy Adam odpowie:
** NIE, to  <math>x\in\left[a,\left\lfloor \left( a+b-1 \right)/2 \right\rfloor\right]</math> ,
** NIE, to  <math>x\in\left[a,\left\lfloor \left( a+b-1 \right)/2 \right\rfloor\right]</math> ,
** TAK, to  <math>x\in\left[\left\lfloor \left( a+b+1 \right)/2 \right\rfloor,b\right]</math> .
** TAK, to  <math>x\in\left[\left\lfloor \left( a+b+1 \right)/2 \right\rfloor,b\right]</math> .


Za każdym razem, zbiór możliwych wartości  <math>x </math>  zmniejsza się o połowę. Tak pomniejszony zbiór przeszukujemy wykorzystując rekurencyjnie opisywaną strategię.
Za każdym razem, zbiór możliwych wartości  <math>x</math>  zmniejsza się o połowę. Tak pomniejszony zbiór przeszukujemy wykorzystując rekurencyjnie opisywaną strategię.


Dla uproszczenia obliczeń załóżmy, że Marek na początku powiększa przedział poszukiwań do <math>\left[0,2^{\left\lceil \lg  n \right\rceil}-1\right] </math>. Może oczywiście tak zrobić, bo  <math>n\leq 2^{\left\lceil \lg  n \right\rceil}. </math> Równanie rekurencyjne opisujące liczbę zapytań  <math>T\!\left( n \right) </math> jest więc postaci
Dla uproszczenia obliczeń załóżmy, że Marek na początku powiększa przedział poszukiwań do <math>\left[0,2^{\left\lceil \lg  n \right\rceil}-1\right]</math>. Może oczywiście tak zrobić, bo  <math>n\leq 2^{\left\lceil \lg  n \right\rceil}.</math> Równanie rekurencyjne opisujące liczbę zapytań  <math>T\!\left( n \right)</math> jest więc postaci




Linia 182: Linia 182:




Dla liczb postaci  <math>2^k </math> , gdzie  <math>k=0,1,\ldots </math>  otrzymujemy prostszą postać:
Dla liczb postaci  <math>2^k</math> , gdzie  <math>k=0,1,\ldots</math>  otrzymujemy prostszą postać:




Linia 201: Linia 201:




Dla  <math>n=1 </math>  otrzymujemy, że
Dla  <math>n=1</math>  otrzymujemy, że




Linia 208: Linia 208:




Przejdźmy więc do przypadku, gdy  <math>k>0 </math> .  
Przejdźmy więc do przypadku, gdy  <math>k>0</math> .  
Korzystając z założenia indukcyjnego, że  <math>T\!\left( 2^{k-1} \right)=k-1</math> , otrzymujemy:
Korzystając z założenia indukcyjnego, że  <math>T\!\left( 2^{k-1} \right)=k-1</math> , otrzymujemy:


Linia 246: Linia 246:


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">   
Udowodnij indukcyjnie, ze względu na  <math>n </math> ,  
Udowodnij indukcyjnie, ze względu na  <math>n</math> ,  
że liczba ruchów potrzebna do posortowania  <math>2^n</math>  kart  
że liczba ruchów potrzebna do posortowania  <math>2^n</math>  kart  
wymaga  <math>\frac{3}{2}n2^n</math>  ruchów.
wymaga  <math>\frac{3}{2}n2^n</math>  ruchów.
Linia 285: Linia 285:




Przejdźmy więc do przypadku, gdy  <math>n>0 </math> .
Przejdźmy więc do przypadku, gdy  <math>n>0</math> .
Korzystając z założenia indukcyjnego otrzymujemy:
Korzystając z założenia indukcyjnego otrzymujemy:


Linia 312: Linia 312:




przy czym  <math>n </math>  jest postaci  <math>2^{2^k} </math> , gdzie  <math>k </math>  jest liczbą naturalną.
przy czym  <math>n</math>  jest postaci  <math>2^{2^k}</math> , gdzie  <math>k</math>  jest liczbą naturalną.


}}
}}
Linia 318: Linia 318:
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">   
Policz kilka pierwszych wyrazów tego ciągu.
Policz kilka pierwszych wyrazów tego ciągu.
Zaobserwuj, że  <math>T\!\left( 2^{2^k} \right)=k </math> ,  
Zaobserwuj, że  <math>T\!\left( 2^{2^k} \right)=k</math> ,  
a następnie udowodnij indukcyjnie, że w istocie tak jest.
a następnie udowodnij indukcyjnie, że w istocie tak jest.
</div></div>
</div></div>


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
Po zapisaniu  <math>n </math>  w postaci  <math>2^{2^k} </math>  otrzymujemy równanie:
Po zapisaniu  <math>n</math>  w postaci  <math>2^{2^k}</math>  otrzymujemy równanie:




Linia 342: Linia 342:




Dla początkowej wartości  <math>k=0 </math>  otrzymujemy, że
Dla początkowej wartości  <math>k=0</math>  otrzymujemy, że





Wersja z 10:06, 5 wrz 2023

Rekurencja

Ćwiczenie 1

Znajdź postać zwartą ciągu zadanego równaniem rekurencyjnym:


{a0=2,a1=5,an=5an16an2dla n2,


Wskazówka
Rozwiązanie

Ćwiczenie 2

Znajdź postać zwartą ciągu zadanego równaniem rekurencyjnym:


{a0=1,a1=2,an=an12an2dla n2
Wskazówka
Rozwiązanie

Ćwiczenie 3

Ciąg liczb Lucasa jest definiowany następującą zależnością rekurencyjną:


{l0=1,l1=3,ln=ln1+ln2dla n2.


Udowodnij, że ln=fn+1+fn1, gdzie fn jest n -tą liczbą Fibonacci'ego. (Dla precyzji obliczeń przyjmij, że f1=0 .)

Wskazówka
Rozwiązanie

Ćwiczenie 4

Adam i Marek zabawiali się w następującą grę. Adam wymyślał liczbę z zakresu od 0 do n1 . Zadaniem Marka było odgadnąć tę liczbę zadając Adamowi pytania, na które mógł odpowiadać jedynie TAK lub NIE. Znajdź najmniejszą liczbę pytań, po której Marek zawsze odnajdzie szukaną liczbę.

Wskazówka
Rozwiązanie

Ćwiczenie 5

Talia składa się z 2n kart. Sortujemy te karty poprzez rekurencyjne rozkładanie ich na dwie równe kupki w następujący sposób:

  • Jeśli kupka składa się z jednej karty, to kupka ta jest posortowana.
  • Kupkę zawierającą 2k kart, gdzie k>0 ,

dzielimy na dwie kupki zawierające po 2k1 kart. Każdą z tych mniejszych kupek sortujemy oddzielnie (powtarzając rekurencyjnie całą procedurę sortowania). Następnie kolejno zbieramy karty ze szczytów obu kupek, zawsze zabierając większą z dwu szczytowych kart.

Oblicz ile ruchów potrzebnych było do posortowania wszystkich 2n kart, jeżeli rozdzielenie 2k kart na dwie kupki wymaga 2k1 ruchów, a złożenie dwu posortowanych kupek, o 2k1 kartach, w jedną całość wymaga 2k ruchów.

Wskazówka
Rozwiązanie

Ćwiczenie 6

Rozwiąż równanie rekurencyjne:


{T(2)=0,T(n)=2T(n)+1dla n1


przy czym n jest postaci 22k , gdzie k jest liczbą naturalną.

Wskazówka
Rozwiązanie