Indukcja i rekurencja
Wykłady z matematyki dyskretnej dla informatyków i teleinformatyków
UTP Bydgoszcz
02b
Indukcja matematyczna
Zasada inducji matematycznej.
Niech T (n) będzie tezą (wzorem), w której występuje liczba naturalna n oraz niech n0 ∈ N. Ponadto niech będą spełnione dwa warunki.
1 T (n0) jest słuszna.
2 Prawdziwa jest implikacja:
jeżeli T (k) jest słuszna, to T (k + 1) jest słuszna (dla k n0).
Wtedy T (n) jest słuszna dla każdej liczby naturalnej n n0. Uwaga.
Najczęściej przyjmujemy n0= 1.
Oczywiście w punkcie 2 literę k możemy zastąpić dowolną inną literą, na przykład n lub n − 1.
Zasada inducji matematycznej
Przykład. Nierówność Bernoulliego:
(1 + x )n> 1 + nx dla n 2, x > −1, x 6= 0.
1 Sprawdzamy dla n = 2.
(1 + x )2 = 1 + 2x + x2> 1 + 2x ; teza jest słuszna dla n = 2.
2 Załóżmy, że teza jest słuszna dla n.
Wykażemy, że jest słuszna dla n + 1.
(1 + x )n> 1 + nx
(1 + x )n· (1 + x) > (1 + nx)(1 + x) (1 + x )n+1> 1 + (n + 1)x + nx2 (1 + x )n+1> 1 + (n + 1)x
Wykazaliśmy oba kroki indukcyjne, więc teza została udowodniona dla n 2.
Definicje rekurencyjne
Rekurencja to odwoływanie się funkcji lub definicji do samej siebie.
Początkowy element (może być ich kilka) jest znany. Definicja
rekurencyjna odwołuje się do jednego lub wielu elementów poprzednich.
Przykład: silnia.
Zamiast liczyć “tradycyjnie” n! = 1 · 2 · . . . · n możemy zastosować rekurencję.
Silnia
n! =
(1 dla n = 0,
(n − 1)! · n dla n > 0 Algorytm (Python) sil (n) = n!.
def sil(n):
if n==0:
return 1 return sil(n-1)*n
24 6 2 1
sil (4) sil (3)
4·
sil (2) 3·
sil (1) 2·
sil (0) = 1 1·
Schemat rekurencyjny dla obliczania 4!
n! =
(1 dla n = 0,
(n − 1)! · n dla n > 0 Algorytm (Python) sil (n) = n!.
def sil(n):
if n==0:
return 1 return sil(n-1)*n
24 6 2 1
sil (4) sil (3)
4·
sil (2) 3·
sil (1) 2·
sil (0) = 1 1·
Silnia
Wzór Stirlinga.
Dla każdego n ∈ N+ zachodzą oszacowania:
√ 2π ·√
n · nne−n ¬ n! ¬ e√
n · nne−n.
Ponadto,
n! =
n e
n√ 2πn ·
1 + O1 n
≈
n e
n
·√ 2πn.
Potęga ubywająca n
k, k, n ∈ N.
nk = n(n − 1)(n − 2) · . . . · (n − k + 1)
| {z }
k czynników
= n!
(n − k)!
nk =
0 dla n < k, 1 dla k = 0 Qk
i =1(n − i + 1) dla 0 < k ¬ n Potęga ubywająca nk, wzór rekurencyjny
nk =
0 dla n < k, 1 dla k = 0
n · (n − 1)k−1 dla 0 < k ¬ n
Schemat działania algorytmu dla k = 4, n = 6.
Algorytm (Python) pu(n, k) = nk. def pu(n,k):
if n<k:
return 0 elifk==0:
return 1
return pu(n-1,k-1)*n
360 60 12 3
pu(6, 4) pu(5, 3) 6·
pu(4, 2) 5·
pu(3, 1) 4·
pu(2,0) =1 3·
Potęga przyrastająca
Potęga przyrastająca nk.
nk = n · (n + 1) · . . . · (n + k − 2) · (n + k − 1)
| {z }
k czynników
nk =
1 dla k = 0,
0 dla n = 0 ∧ k 6= 0, k, n ∈ N, Qk
i =1(n + i − 1) dla k 6= 0 ∧ n 6= 0
Potęga przyrastająca
Potęga przyrastająca nk.
k
Y
i =1
(n + i − 1) = n · (n + 1) · · · (n + k − 2) · (n + k − 1)
| {z }
k czynników
Zauważmy, że
nk−1· (n + k − 1) =Qk−1i =1(n + i − 1) · (n + k − 1) =Qki =1(n + i − 1) = nk Wzór rekurencyjny
nk =
1 dla k = 0,
0 dla n = 0 ∧ k 6= 0, k, n ∈ N, nk−1· (n + k − 1) dla k 6= 0 ∧ n 6= 0
Potęga przyrastająca
Potęga przyrastająca nk.
nk =
1 dla k = 0,
0 dla n = 0 ∧ k 6= 0, k, n ∈ N, nk−1· (n + k − 1) dla k 6= 0 ∧ n 6= 0 Algorytm (Python) pp(n, k) = nk.
def pp(n,k):
if k==0:
return 1
elif n==0 and k>=1:
return 0
return pp(n,k-1)*(n+k-1)
Schemat działania algorytmu dla k = 4, n = 6.
Algorytm (Python) pp(n, k) = nk. def pp(n,k):
if k==0:
return 1
elif n==0 and k>=1:
return 0
return pp(n,k-1)*(n+k-1)
3024 336 42 6
pp(6, 4) pp(6, 3) 9·
pp(6, 2) 8·
pp(6, 1) 7·
pp(6, 0) = 1 6·
Definicje indukcyjne/rekurencyjne
Mamy dane a0, r oraz q.
Ciąg arytmetyczny: an=
(a0 dla n = 0, an−1+ r dla n > 0
Fakt. an= a0+ nr . Ciąg geometryczny: an=
(a0 dla n = 0, an−1· q dla n > 0
Fakt 1.
Dla q = 0 wszystkie wyrazy w ciągu (z wyjątkiem pierwszego, jeśli a0 6= 0) to zera.
Fakt 2. Jeżeli q 6= 0, to an= a0· qn.
Dla niektórych ciągów znalezienie “jawnego” wzoru na jego n-ty wyraz nie jest łatwe.
Liczby harmoniczne: H
n= 1 +
12+
13+ · · · +
1nDefinicja rekurencyjna:
H1 = 1, Hn+1 = Hn+ 1
n + 1 dla n 1 Fakt.
ln(n + 1) < Hn< 1 + ln n Liczby harmoniczne s-tego rzędu:
Hn,s = 1 + 1 2s + 1
3s + · · · + 1 ns Fakt. Gdy s > 1, to ciąg H1,s, H2,s, H3,s, . . . jest zbieżny, a jego granicą jest funkcja zeta Riemanna ζ(s) =P∞n=1n1s.
Liczby Fibonacciego
FIB(n) =
0 dla n = 0, 1 dla n = 1,
FIB(n − 1) + FIB(n − 2) dla n 2
Kilka liczb Fibonacciego:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584
Liczby Fibonacciego
Kilka liczb Fibonacciego:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34
Liczby Fibonacciego
Kilka liczb Fibonacciego:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34
Liczby Fibonacciego
Kilka liczb Fibonacciego:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34
Liczby Fibonacciego
Kilka liczb Fibonacciego:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34
Liczby Fibonacciego
Kilka liczb Fibonacciego:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34
Liczby Fibonacciego
Kilka liczb Fibonacciego:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34
Liczby Fibonacciego
Kilka liczb Fibonacciego:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34
Liczby Fibonacciego
FIB(n) =
0 dla n = 0, 1 dla n = 1,
FIB(n − 1) + FIB(n − 2) dla n 2 ,
Twierdzenie (Zeckendorff)
Każda dodatnia liczba naturalna może być przedstawiona jako suma różnych liczb Fibonacciego (tak, by suma ta
nie zawierała dwóch kolejnych liczb Fibonacciego).
PRZYKŁAD.
100 = 1 + 2 + 8 + 89 = FIB(1) + FIB(3) + FIB(6) + FIB(11) 100 = 3 + 8 + 89 = FIB(4) + FIB(6) + FIB(11)
1000000 = 55 + 144 + 46368 + 121393 + 832040
= FIB(10) + FIB(12) + FIB(24) + FIB(26) + FIB(30)
Ciąg Fibonacciego
FIB(n) =
0 dla n = 0, 1 dla n = 1,
FIB(n − 1) + FIB(n − 2) dla n 2 ,
Twierdzenie (Eulera-Bineta)
FIB(n) = 1
√ 5
"
1 +√ 5 2
!n
− 1 −√ 5 2
!n# .
Wyprowadzimy ten wzór później korzystając z funkcji tworzących.
„Złota liczba (złota proporcja)” ϕ =
1+√5
2
≈ 1.618
Własność.
n→∞lim
FIB(n + 1)
FIB(n) = 1 +√ 5
2 .
Dowód, I sposób.
n→∞lim
FIB(n + 1)
FIB(n) = lim
n→∞
√1 5
1+√ 5 2
n+1
−1−
√ 5 2
n+1
√1 5
h1+√ 5 2
n
−1−
√ 5 2
ni
= lim
n→∞
ϕn+1− (1 − ϕ)n+1
ϕn− (1 − ϕ)n = lim
n→∞
ϕ − (1 − ϕ)1−ϕϕ n 1 −1−ϕϕ n
= ϕ
FIB(n) = √1
5
h1+√ 5 2
n
−
1−√ 5 2
ni
Własność.
n→∞lim
FIB(n + 1)
FIB(n) = 1 +√ 5
2 .
Dowód, I sposób.
n→∞lim
FIB(n + 1)
FIB(n) = lim
n→∞
√1 5
1+√ 5 2
n+1
−1−
√ 5 2
n+1
√1 5
h1+√ 5 2
n
−1−
√ 5 2
ni
= lim
n→∞
ϕn+1− (1 − ϕ)n+1
ϕn− (1 − ϕ)n = lim
n→∞
ϕ − (1 − ϕ)1−ϕϕ n 1 −1−ϕϕ n
= ϕ
„Złota liczba (złota proporcja)” ϕ =
1+√5
2
≈ 1.618
Własność.
n→∞lim
FIB(n + 1)
FIB(n) = 1 +√ 5
2 .
Dowód, I sposób.
n→∞lim
FIB(n + 1)
FIB(n) = lim
n→∞
√1 5
1+√ 5 2
n+1
−1−
√ 5 2
n+1
√1 5
h1+√ 5 2
n
−1−
√ 5 2
ni
= lim
n→∞
ϕn+1− (1 − ϕ)n+1
ϕn− (1 − ϕ)n = lim
n→∞
ϕ − (1 − ϕ)1−ϕϕ n 1 −1−ϕϕ n
= ϕ
lim
n→∞ FIB(n+1)FIB(n)
=
1+√5
2
= ϕ =
1+√5
2
≈ 1.618
Dowód, II sposób. Ponieważ ciąg FIB(n+1)FIB(n) jest nierosnący i ograniczony z dołu (na przykład przez 0), więc ma granicę; oznaczmy ją przez x . Oczywiście tę samą granicę x ma ciąg FIB(n−1)FIB(n) .
x = lim
n→∞
FIB(n + 1)
FIB(n) = lim
n→∞
FIB(n) + FIB(n − 1) FIB(n)
= 1 + lim
n→∞
FIB(n − 1)
FIB(n) = 1 + 1
limn→∞ FIB(n) FIB(n−1)
= 1 + 1 x Jedynym dodatnim rozwiązaniem równania x = 1 + 1x jest x = ϕ.
„Złoty podział (złota proporcja)”
a b
c Dzielimy tak, by
a
b = a + b a .
Po podstawieniu x = ab otrzymamy równanie x = 1 + 1x, którego jedynym dodatnim rozwiązaniem jest x = ϕ = 1+
√ 5
2 ≈ 1.618.
„Złoty podział (złota proporcja)”
a b
a + b
a b
Dzielimy tak, by
a
b = a + b a .
Po podstawieniu x = ab otrzymamy równanie x = 1 +x1, którego jedynym dodatnim rozwiązaniem jest x = ϕ = 1+
√ 5
2 ≈ 1.618.
lim
n→∞ FIB(n+1)FIB(n)
=
1+√5
2
= ϕ =
1+√5
2
≈ 1.618.
Obserwacja.
FIB(1) FIB(0) = 1
1 = 1 FIB(2)
FIB(1) = 2
1 = 1 +1 1 FIB(3)
FIB(2) = 3
2 = 1 + 1 1 +11 FIB(4)
FIB(3) = 5
3 = 1 + 1 1 +1+11
1
lim
n→∞ FIB(n+1)FIB(n)
=
1+√5
2
= ϕ =
1+√5
2
≈ 1.618
Obserwacja.
Kolejne wyrazy FIB(n+1)FIB(n) można wyrazić ułamkiem łańcuchowym:
1 + 1
1 + 1
1+ 1
1+ 1
1+ 1
1+ 1 1+...
Liczby Stirlinga II rodzaju
Liczby Stirlinga II rodzaju, oznaczane {nk} („ k podzbiorów n”) lub S (n, k), opisują liczbę sposobów podziału zbioru n elementowego na k niepustych podzbiorów, których kolejność nie jest istotna.
Przykład. {43} =6, gdyż czteroelementowy zbiór, na przykład {A, B, C , D} możemy podzielić na sześćsposobów na trzy niepuste podzbiory:
{A}, {B}, {C , D}
{A}, {C }, {B, D}
{A}, {D}, {B, C } {B}, {C }, {A, D}
{B}, {D}, {A, C } {C }, {D}, {A, B}
Liczby Stirlinga II rodzaju
Przykład.
{32} =3, gdyż trójelementowyzbiór {A, B, C } możemy podzielić natrzy sposoby na dwaniepuste podzbiory:
{A}, {B, C }; {B}, {A, C }; {C }, {B, A}.
Liczby Stirlinga II rodzaju
Niektóre liczby Stirlinga II rodzaju:
n/k 0 1 2 3 4 5 6 7 8
0 - - - -
1 0 1 - - - -
2 0 1 1 - - - -
3 0 1 3 1 - - - - -
4 0 1 7 6 1 - - - -
5 0 1 15 25 10 1 - - -
6 0 1 31 90 65 15 1 - -
7 0 1 63 301 350 140 21 1 -
8 0 1 127 966 1701 1050 266 28 1
Liczby Stirlinga II rodzaju
Liczby Stirlinga II rodzaju, oznaczane {nk} („ k podzbiorów n”), opisują liczbę sposobów podziału zbioru n elementowego na k niepustych podzbiorów, których kolejność nie jest istotna.
Przykłady.
{n0} = 0 dla n 1
{n1} = 1 dla n 1 (istnieje tylko jeden podział na jeden niepusty podzbiór) {nn} = 1 (istnieje tylko jeden podział na n niepustych zbiorów)
{nk} = 0 dla k > n (nie da się podzielić zbioru n elementowego na n + 1 lub więcej niepustych podzbiorów)
Liczby Stirlinga II rodzaju, wzór rekurencyjny
{nk} =
0, dla (n 1 ∧ k = 0) ∨ k > n 1, dla (n 1 ∧ k = 1) ∨ k = n
{n−1k−1}+k · {n−1k } w pozostałych przypadkach Uzasadnienie. Niech X = {c1, c2, . . . , cn}. Rozdzielmy wszystkie podziały tego zbioru na dwie klasy: te które zawierają zbiór
jednoelementowy {c1} oraz te, które go nie zawierają. Klasa pierwsza zawiera {n−1k−1}elementów, gdyż pozostałe n − 1 elementy dzielimy na k − 1 zbiorów. Klasa druga zawiera k · {n−1k }elementów, gdyż najpierw dzielimy zbiór X \ {c1} = {c2, . . . , cn} na k niepustych podzbiorów (mamy {n−1k } możliwości), potem dołączamy element c1 do jednego z tych zbiorów (mamy k możliwości).
Wieże Hanoi
Wieże Hanoi.
Mamy trzy paliki (wieże) A, B, C . Paliki B i C są puste, a na paliku A znajduje się n krążków o różnych średnicach, nanizanych w porządku od największego (na dole) do najmniejszego (na górze). Należy przenieść krążki na palik B (wolno posłużyć się palikiem C ) stosując reguły:
można przenosić tylko po jednym krążku;
nie można umieszczać krążka większego na mniejszym.
Medoda dla n = 1 (jeden ruch, r1= 1): A → B.
Medoda dla n = 2 (trzy ruchy, r2 = 3): A → C , A → B, C → B.
Metoda dla n = 3 (siedem ruchów, r
3= 7):
Ilustracja.
palik A tu są
palik B tu mają być
palik C
pomocniczy pomocniczy
Metoda dla n = 3 (siedem ruchów, r
3= 7): A → B,
Ilustracja.
palik A tu są
palik B tu mają być
palik C
pomocniczy pomocniczy
palik A tu są
palik B tu mają być
palik C
pomocniczy
Metoda dla n = 3 (siedem ruchów, r
3= 7): A → B, A → C ,
Ilustracja.
Metoda dla n = 3 (siedem ruchów, r
3= 7): A → B, A → C , B → C ,
Ilustracja.
Metoda dla n = 3 (siedem ruchów, r
3= 7): A → B, A → C , B → C , A → B,
Ilustracja.
Metoda dla n = 3 (siedem ruchów, r
3= 7): A → B, A → C , B → C , A → B, C → A,
Ilustracja.
Metoda dla n = 3 (siedem ruchów, r
3= 7): A → B, A → C , B → C , A → B, C → A, C → B,
Ilustracja.
Metoda dla n = 3 (siedem ruchów, r
3= 7): A → B, A → C , B → C , A → B, C → A, C → B, A → B.
Ilustracja.
Algorytm dla n (liczba ruchów: r
n= 2
n− 1).
Wiemy, że r1 = 1, r2 = 3, r3 = 7.
Algorytm rekurencyjny.
Przenosimy n − 1 górnych krążków ze słupka A na słupek C wykorzystując słupek B (zobacz czwarty rysunek na poprzednim slajdzie). Możemy „zapomnieć” o największym krążku. Wykonamy więc rn−1 ruchów.
Wykonujemy jeden ruch. Przenosimy największy krążek z A na B (piąty rysunek). Ten krążek jest już na właściwym miejscu.
Przenosimy n − 1 krążków ze słupka C na słupek B wykorzystując słupek A. Wykonamy rn−1 ruchów.
Otrzymamy
rn= rn−1+ 1 + rn−1 = 2rn−1+ 1.
Algorytm dla n (liczba ruchów: r
n= 2
n− 1).
Czas na dowód indukcyjny, że jeśli
rn=
(1 dla n = 1
2rn−1+ 1 dla n 2 , to
rn= 2n− 1.
1 Dla n = 1 mamy
r1= 1 =21− 1.
2 Zakładamy, że rn−1= 2n−1− 1. Wtedy
rn=2rn−1+ 1= 2(2n−1− 1) + 1 = 2 · 2n−1− 2 + 1 =2n− 1.
Udowodnimy też ten wzór później inną metodą - korzystając z funkcji tworzących.