Matematyka dyskretna 1/Ćwiczenia 2: Rekurencja

From Studia Informatyczne

Rekurencja

Ćwiczenie 1

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


\displaystyle \left\lbrace \aligned a_0 &= 2,\\ a_1 &= 5,\\ a_n &= 5 a_{n-1} - 6 a_{n-2}\quad\textrm{dla}\ n\geq 2. \endaligned  \right.


Wskazówka

Wypisz kilka początkowych wyrazów ciągu. Zaobserwuj, że \displaystyle a_n=2^n+3^n, a następnie udowodnij to indukcyjnie ze względu na \displaystyle n .

Rozwiązanie

Przeprowadźmy dowód, że \displaystyle a_n=2^n+3^n , indukcyjnie ze względu na \displaystyle n . Dla wartości początkowych \displaystyle n=0,1 dostajemy odpowiednio, że


\displaystyle \aligned a_0&=2 \ =\ 2^0+3^0,\\ a_1&=5 \ =\ 2^1+3^1. \endaligned


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


\displaystyle \aligned a_n&=5 a_{n-1} - 6 a_{n-2}\\ &=5\left( 2^{n-1}+3^{n-1} \right)-6\left( 2^{n-2}+3^{n-2} \right)\\ &=4\cdot2^{n-2}+9\cdot3^{n-2}\\ &=2^n+3^n, \endaligned


co kończy dowód.

Ćwiczenie 2

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


\displaystyle \left\lbrace \aligned a_0 &= 1,\\ a_1 &= 2,\\ a_n &=  \frac{a_{n-1}^2}{a_{n-2}}\quad\textrm{dla}\ n\geq 2. \endaligned  \right.

Wskazówka

Wypisz kilka początkowych wyrazów ciągu. Zaobserwuj, że \displaystyle a_n=2^n, a następnie udowodnij to indukcyjnie ze względu na \displaystyle n .

Rozwiązanie

Przeprowadźmy dowód, że \displaystyle a_n=2^n , indukcyjnie ze względu na \displaystyle n . Dla wartości początkowych \displaystyle n=0,1 dostajemy odpowiednio, że


\displaystyle \aligned a_0&= 1\ =\ 2^0,\\ a_1&= 2\ =\ 2^1. \endaligned


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


\displaystyle a_n\ =\ \frac{a_{n-1}^2}{a_{n-2}}\ =\ \frac{\left( 2^{n-1} \right)^2}{2^{n-2}}\ =\ 2^{2\left( n-1 \right)-\left( n-2 \right)}\ =\ 2^n,


co kończy dowód.

Ćwiczenie 3

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


\displaystyle \left\lbrace \aligned l_0 &= 1,\\ l_1 &= 3,\\ l_n &= l_{n-1}+ l_{n-2}\quad\textrm{dla}\ n\geq 2. \endaligned  \right.


Udowodnij, że \displaystyle l_n = f_{n+1} + f_{n-1}, gdzie \displaystyle f_n jest \displaystyle n -tą liczbą Fibonacci'ego. (Dla precyzji obliczeń przyjmij, że \displaystyle f_{-1}=0 .)

Wskazówka

Zastosuj indukcję względem \displaystyle n .

Rozwiązanie

Dowód przeprowadzimy, indukcyjnie ze względu na \displaystyle n . Dla wartości początkowych \displaystyle n=0,1 dostajemy odpowiednio, że


\displaystyle \aligned f_1 + f_{-1}&= 1 + 0\ =\ 1\ = l_0,\\ f_2 + f_0&=2 + 1\ =\ 3\ = l_1. \endaligned


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


\displaystyle \aligned l_n&=l_{n-1} + l_{n-2}\\ &=\left( f_n + f_{n-2} \right)+\left( f_{n-1} + f_{n-3} \right)\\ &=\left( f_n + f_{n-1} \right)+\left( f_{n-2} + f_{n-3} \right)\\ &=f_{n+1} + f_{n-1}, \endaligned


co kończy dowód.

Ćwiczenie 4

Adam i Marek zabawiali się w następującą grę. Adam wymyślał liczbę z zakresu od \displaystyle 0 do \displaystyle n-1 . 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

Załóżmy, że Marek ma pewność, że szukana liczba \displaystyle x znajduje się w przedziale \displaystyle \left[a,b\right] . Po uzyskaniu odpowiedzi na pytanie, czy \displaystyle x jest większa niż \displaystyle \left\lfloor \left( a+b+1 \right)/2 \right\rfloor , Marek zawęzi zbiór poszukiwań o połowę, szukając później liczby \displaystyle x w przedziale \displaystyle \left[a,\left\lfloor \left( a+b-1 \right)/2 \right\rfloor\right] albo w przedziale \displaystyle \left[\left\lfloor \left( a+b+1 \right)/2 \right\rfloor,b\right] . Dla uproszczenia obliczeń załóż, że Marek szuka liczby z zakresu \displaystyle \left[0,2^{\left\lceil \lg  n \right\rceil}-1\right] .

Rozwiązanie

Strategię Marka można przedstawić w następujący rekurencyjny sposób:

  • Jeśli szukana liczba \displaystyle x jest z zakresu \displaystyle \left[a,b\right], gdzie \displaystyle a=b, to Marek wie, że szukana liczba to \displaystyle a .
  • Jeśli szukana \displaystyle x liczba jest z zakresu \displaystyle \left[a,b\right], gdzie \displaystyle a<b, to Marek zadaje pytanie, czy \displaystyle x\geq\left\lfloor \left( a+b+1 \right)/2 \right\rfloor. Gdy Adam odpowie:
    • NIE, to \displaystyle x\in\left[a,\left\lfloor \left( a+b-1 \right)/2 \right\rfloor\right] ,
    • TAK, to \displaystyle x\in\left[\left\lfloor \left( a+b+1 \right)/2 \right\rfloor,b\right] .

Za każdym razem, zbiór możliwych wartości \displaystyle x 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 \displaystyle \left[0,2^{\left\lceil \lg  n \right\rceil}-1\right]. Może oczywiście tak zrobić, bo \displaystyle n\leq 2^{\left\lceil \lg  n \right\rceil}. Równanie rekurencyjne opisujące liczbę zapytań \displaystyle T\!\left( n \right) jest więc postaci


\displaystyle \left\lbrace \aligned T\!\left( 1 \right) &= 0,\\ T\!\left( n \right) &= T\!\left( \left\lceil \frac{n}{2} \right\rceil \right)+1\quad\textrm{dla}\ n\geq 2. \endaligned  \right.


Dla liczb postaci \displaystyle 2^k , gdzie \displaystyle k=0,1,\ldots otrzymujemy prostszą postać:


\displaystyle \left\lbrace \aligned T\!\left( 1 \right) &= 0,\\ T\!\left( 2^k \right) &= T\!\left( 2^{k-1} \right)+1\quad\textrm{dla}\ k\geq 1. \endaligned  \right.


Pokażmy indukcyjnie, że


\displaystyle T\!\left( 2^k \right)=k.


Dla \displaystyle n=1 otrzymujemy, że


\displaystyle T\!\left( 1 \right)=\lg  1 = 0.


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


\displaystyle T\!\left( 2^k \right)\ =\ T\!\left( 2^{k-1} \right)+1\ =\ \left( k-1 \right)+1\ =\ k.


W konsekwencji wiemy, że liczba pytań po których Marek dowie się o jaką liczbę chodzi jest równa


\displaystyle T\!\left( 2^{\left\lceil \lg  n \right\rceil} \right)=\left\lceil \lg  n \right\rceil.


Ćwiczenie 5

Talia składa się z \displaystyle 2^n 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ą \displaystyle 2^k kart, gdzie \displaystyle k>0 ,

dzielimy na dwie kupki zawierające po \displaystyle 2^{k-1} 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 \displaystyle 2^n kart, jeżeli rozdzielenie \displaystyle 2^k kart na dwie kupki wymaga \displaystyle 2^{k-1} ruchów, a złożenie dwu posortowanych kupek, o \displaystyle 2^{k-1} kartach, w jedną całość wymaga \displaystyle 2^k ruchów.

Wskazówka

Udowodnij indukcyjnie, ze względu na \displaystyle n , że liczba ruchów potrzebna do posortowania \displaystyle 2^n kart wymaga \displaystyle \frac{3}{2}n2^n ruchów.

Rozwiązanie

Z definicji rekurencyjnej sortowania kart wynika, że dla \displaystyle n>0 liczba \displaystyle T\!\left( 2^n \right) potrzebnych przełożeń \displaystyle 2^n kart jest równa sumie

  • \displaystyle 2^{n-1} ruchów na rozdzielenie kupek,
  • \displaystyle 2T\!\left( 2^{n-1} \right) posortowanie obu rozdzielonych kupek,
  • \displaystyle 2^n ruchów na scalenie dwu posortowanych części.

Otrzymujemy więc następujące równanie rekurencyjne:


\displaystyle \left\lbrace \aligned T\!\left( 1 \right) &= 0,\\ T\!\left( 2^n \right) &= 2T\!\left( 2^{n-1} \right)+\frac{3}{2}\cdot2^n\quad\textrm{dla}\ n\geq 1. \endaligned  \right.


Udowodnijmy indukcyjnie ze względu na \displaystyle n , że


\displaystyle T\!\left( 2^n \right)=\frac{3}{2}n2^n.


Dla jednej karty mamy:


\displaystyle \frac{3}{2}\cdot0\cdot2^0=0=T\!\left( 1 \right)= T\!\left( 2^0 \right),


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


\displaystyle \aligned T\!\left( 2^n \right)&= 2T\!\left( 2^{n-1} \right)+\frac{3}{2}\cdot2^n\\ &=2\left( \frac{3}{2}\left( n-1 \right)2^{n-1} \right)+\frac{3}{2}\cdot2^n\\ &=\frac{3}{2}n2^n-\frac{3}{2}\cdot2^n+\frac{3}{2}\cdot2^n\\ &=\frac{3}{2}n2^n, \endaligned


co kończy dowód.

Ćwiczenie 6

Rozwiąż równanie rekurencyjne:


\displaystyle \left\lbrace \aligned T\!\left( 2 \right) &= 0,\\ T\!\left( n \right) &= 2T\!\left( \sqrt{n} \right)+1\quad\textrm{dla}\ n\geq 1, \endaligned  \right.


przy czym \displaystyle n jest postaci \displaystyle 2^{2^k} , gdzie \displaystyle k jest liczbą naturalną.

Wskazówka

Policz kilka pierwszych wyrazów tego ciągu. Zaobserwuj, że \displaystyle T\!\left( 2^{2^k} \right)=k , a następnie udowodnij indukcyjnie, że w istocie tak jest.

Rozwiązanie

Po zapisaniu \displaystyle n w postaci \displaystyle 2^{2^k} otrzymujemy równanie:


\displaystyle \left\lbrace \aligned T\!\left( 2 \right) &= 0,\\ T\!\left( 2^{2^k} \right) &= 2T\!\left( 2^{2^{k-1}} \right)+1\quad\textrm{dla}\ k\geq 1, \endaligned  \right.


Udowodnimy indukcyjnie ze względu na \displaystyle k\geq0 , że


\displaystyle T\!\left( 2^{2^k} \right)=k.


Dla początkowej wartości \displaystyle k=0 otrzymujemy, że


\displaystyle T\!\left( 2^{2^0} \right)= T\!\left( 2 \right)=0.


Przejdźmy więc do przypadku, gdy \displaystyle k\geq0 . Korzystając z założenia indukcyjnego otrzymujemy, że


\displaystyle T\!\left( 2^{2^k} \right)=2T\!\left( 2^{2^{k-1}} \right)+1=\left( k-1 \right)+1=k.


W konsekwencji, gdy \displaystyle n jest postaci \displaystyle 2^{2^k} , czyli \displaystyle k=\lg  \lg  n , otrzymujemy:


\displaystyle T\!\left( n \right)=\lg  \lg  n.