Podstawy Informatyki Inżynieria Ciepła, I rok Wykład 9 Rekurencja
Rekurencja z łacińskiego oznacza to przybiec z powrotem - osiągniesz rzecz wielką, jeśli zawrócisz po to, by osiągnąć rzeczy małe Przykład: Małe dziecko otrzymuje polecenie posprzątania rozrzuconych klocków do pudełka. zebrać wszystkie klocki naraz???? - skomplikowane zadanie wziąć jeden klocek, przełożyć go do pudełka, a następnie zrobić to samo z pozostałymi klockami??? - prosta czynność
Duży problem został rozłożony na problem elementarny, który umiemy rozwiązać. Problem elementarny jest mniej skomplikowany niż problem początkowy. Zakończenie algorytmu jest jasno określone ( w momencie gdy na podłodze nie ma rozrzuconych klocków )
Mamy obliczyć: a n Matematycznie: Wiemy że: a n =a x a n-1 (a n-1 jest łatwiej obliczyć niż a n ) Jeśli jest nadal trudno, to zawsze można wstawić: a n-1 =a x a n-2, gdzie: a n-2 =a x a n-3 itd. wystarczy wiedzieć tylko, że: a 0 =1 aby obliczyć dowolną potęgę a
Def: Program rekurencyjny jest to program, który wywołuje sam siebie Problem: Dysponujemy tablicą n liczb całkowitych A(n) o elementach: a(1),a(2), a(3),..., a(n) Zadanie: sprawdzić, czy w tablicy A występuje liczba x Rozwiązanie: wziąć pierwszy niezbadany element tablicy n elementowej, jeśli aktualnie analizowany element tablicy jest równy x to: wypisz sukces i zakończ działanie w przeciwnym wypadku: zbadaj pozostałą część tablicy n-1 elementów
W programach rekurencyjnych: zakończenie programu jest jasno określone (znaleziony element, przekroczony zakres tablicy), duży problem zostaje rozłożony na problemy elementarne, które umiemy rozwiązać Podstawowe błędy: złe określenie warunku zakończenia programu, niewłaściwa (nieefektywna) dekompozycja problemu.
Algorytmy sortowania danych Najprostsze sortowanie: zamiana dwóch elementów Sortowanie przez selekcję Opis: trzeba wyznaczyć najmniejszy element w ciągu; zamienić go miejscami z pierwszym elementem ciągu, wyznaczyć najmniejszy element w a[2..n] i zamienić go z drugim elementem w ciągu, itd.
Sortowanie przez selekcję - algorytm dla i := 1 do n-1 wykonuj początek min := i; dla j := i+1 do n wykonuj jeśli a[ j ] < a[ min ] to min := j; a[ min ] <-> a[ j ] {zamiana miejscami a[ min ] z a[ j ]} koniec
Sortowanie przez wstawianie (układanie kart do brydża) Opis: metoda polega na wstawianiu następnej karty we właściwe miejsce uporządkowanych uprzednio kart 9 8 3 5 7 9 8 3 5 7 8 9 3 5 7 3 8 9 5 7 3 5 8 9 7 3 5 7 8 9
Sortowanie przez wstawianie - algorytm dla i=2,...,liczba elementów tablicy wykonuj { j :=i podczas gdy j > 1 i x[ j-1 ] > x[ j ] wykonuj { pom := x[ j ] x[ j ] := x[ j-1] x[ j-1] := pom j := j-1 } }
Sortowanie bąbelkowe 0 1 40 2 2 2 2 40 40 39 4 4 4 4 6 4 39 39 39 39 18 4 6 6 6 6 6 4 4 18 18 18 18 18 18 20 20 20 20 20 20 20 20 20 Tablica jest przeszukiwana od dołu. Element zacieniony jest tym, który w pojedynczym przebiegu uleciał do góry jako najlżejszy. Analizowane są zawsze 2 sąsiadujące ze sobą elementy. Jeśli nie są uporządkowane (u góry jest element cięższy ) to następuje ich zamiana.
Wynik sortowania bąbelkowego 0 1 2 3 4 5 6 40 2 2 2 2 2 2 2 40 4 4 4 4 4 39 4 40 6 6 6 6 6 39 6 40 18 18 18 18 6 39 18 40 20 20 4 18 18 39 20 40 39 20 20 20 20 30 39 40
Algorytm sortowania bąbelkowego TAB : Tablica [1..n] elementów typu rzeczywistego i,j : całkowite pom: rzeczywiste Początek {programu} Dla i:=1 do n-1 wykonuj dla j:=n do i+1 z krokiem -1wykonuj Jeśli TAB[j]<TAB[j-1] to początek pom:=tab[j-1]; TAB[j-1]:=TAB[j]; TAB[j]:=pom koniec Koniec {programu}.
Dość często zdarzają się puste przebiegi (nie jest dokonywana żadna wymiana, bowiem elementy są już posortowane. Algorytm jest bardzo wrażliwy na konfigurację początkową danych. Wersja 1: 4 2 6 18 20 39 40 Wersja 2: 4 6 18 20 39 40 2 (wersja 1 wymaga jednej zamiany, a wersja 2 wymaga aż sześciu przebiegów)
Wieża Hanoi A B C Chcemy przenieść krążki z A na B, wykorzystując kołek C. Przenosimy po 1 krążku. Większy krążek nigdy nie może być umieszczony na mniejszym krążku..
A B C A -> B; A -> C; B -> C; A -> B; C -> A; C -> B; A -> B;
A B C 1. A -> B; 8. A -> C; 2. A -> C; 9. B -> C; 3. B -> C; 10. B -> A; 4. A -> B; 11. C -> A; 5. C -> A; 12. B -> C; 6. C -> B; 13. A -> B; 7. A -> B; 14. A -> C; 15. B -> C;
A B C Legenda Tybetu: po przeniesieniu 64 krążków nastąpi koniec świata. Liczba pojedynczych przeniesień: minimum 2 N - 1 (2 3-1 = 8-1 = 7 dla 3 krążków). Dla 64 to jest 2 64-1 tj 18446744073709551615 Jeżeli przeniesienie 1 krążka wymaga 2 sekund, to na przeniesienie 64 krążków potrzeba 1 biliona lat (4,5 miliarda lat temu powstała ziemia). Przy szybkości przenoszenia 1 miliona krążków na sekundę, całkowity czas przeniesienia 64 krążków wynosi minimum pół miliona lat..
Wieża Hanoi - algorytm Podprogram przenieś N z X na Y używając Z; jeżeli N=1, to wypisz X -> Y ; w przeciwnym razie (tj. jeżeli N>1) wykonaj, co następuje: wywołaj przenieś N-1 z X na Z używając Y; wypisz X->Y ; wywołaj przenieś N-1 z Z na Y używając X; wróć. Na stronie: http://wipos.p.lodz.pl/zylla/games/hanoi7p.html jest aplikacja do gry w wieże Hanoi
Jak wykonują się programy rekurencyjne? Zadanie: Obliczyć n! 0! = 1 N! = N*(n-1)! Dla n>=1 Jak to wygląda w praktyce dla n = 3 (3! =?) n = 0? nie 3*2! n = 0? nie 2*1! n = 0? nie 1*0! n = 0? tak 1 -pionowe strzałki oznaczają zagłębianie się programu z poziomu n na n-1, itd., aż do przypadku elementarnego 0!, - pozioma strzałka oznacza obliczanie wyników cząstkowych, - ukośna strzałka prezentuje przekazywanie wyniku cząstkowego z poziomu niższego na wyższy)