Algorytm - pojęcie algorytmu, sposób zapisu, poziom
Transkrypt
Algorytm - pojęcie algorytmu, sposób zapisu, poziom
Algorytm - pojęcie algorytmu, sposób zapisu, poziom szczegółowości, czynności proste i strukturalne. Pojęcie procedury i funkcji. Maria Górska 9 stycznia 2010 1 Spis treści 1 Pojęcie algorytmu 3 2 Sposób zapisu 3 3 Poziom szczegółowości 4 4 Czynności proste i strukturalne 5 5 Pojęcie procedury i funkcji 5 2 1 Pojęcie algorytmu Algorytmem nazywamy ściśle określoną procedurę obliczeniową, która dla danych wejściowych ”produkuje” pożądane dane wyjściowe, czyli wynik działania algorytmu [1]. Możemy więc traktować algorytm jako ciąg kroków obliczeniowych prowadzących do przekształcania danych wejściowych w wyjściowe. Przykładowe algorytmy to chociażby: 1. Algorytm Euklidesa (służący do odnajdywania NWD dwóch liczb); 2. Algorytm służący do obliczania n-tych wyrazów ciągu Fibonacciego; 3. Algorytmy sortowania, np. poprzez kopcowanie. Dobrze skonstruowany algorytm powinien byc poprawny, skończony oraz efektywny. 2 Sposób zapisu Algorytmy można przedstawiać na kilka sposobów: Opis słowny - na ogół mało dokładny, przykładem może być chociażby przepis kulinarny. Lista kolejnych kroków postępowania np: Krok 1 Rozpocznij pracę Krok 2 Pobierz pierwszą liczbę (a) Krok 3 Pobierz durgą liczbę (b) Krok 4 Wykonaj dodawanie liczby pierwszej do drugiej (a+b) Krok 5 Podaj wynik dodawania Krok 6 Zakończ pracę Schemat blokowy - tu przedstawiamy algorytm graficznie, przy pomocy ”skrzynek”: • skrzynka graniczna - ma kształt owalu; oznaczamy nią początek i koniec algorytmu. • skrzynka operacyjna - ma kształt prostokąta; oznacza wykonywane działania, np: podstawianie (i:=1). • skrzynka wejścia - ma kształt równoległoboku; oznacza wprowadzanie danych lub wyprowadzanie wyników. • skrzynka warunkowa - ma kształt rombu; oznacza najczęśćiej sprawdzanie jakiegoś warunku i posiada najczęściej wartość zmiennej boolean (to znaczy może przyjmować wartość prawdy lub fałszu). 3 Drzewo algorytmu - graficzna reprezentacja algorytmu przyjmująca postać drzewa. W takiej reprezentacji, wierzchołki pośrednie drzewa zawierają wykonywane w algorytmie operacje, a w wierzchołkach końcowych znajdują się wszystkie możliwe wyniki wykonania algorytmu. Pomaga ono prześledzić przebieg działania algorytmu oraz określić jego złożoność. W opracowaniach informatycznych drzewo rysowane jest ”do góry nogami”, to znaczy z ”korzeniem” u góry. Wyróżnc można ”korzeń”-wierzchołek, w którym zaczynają się działania algorytmu, wierzchołoki pośrednie, gdzie znajdują się wykonywane operacje, a także wierzchołki końcowe, które odpowiadają różnych możliwością zakończenia działania algorytmu. Pseudokod - korzystając z tego sposobu rezygnujemy z reguł składniowych danego języka programowania na rzecz czytelnośći (np: wyświetl na ekranie: Hello World), często za graficzny obraz pseudokodu przyjmuje się schemat blokowy. Program w danym języku programowania , np. w języku Pascal: begin writeln(’Hello World’); end. 3 Poziom szczegółowości Poziom szczegółowości to jedna z cech algorytmów. Powinien być dobrany tak, aby był zrozumiały dla maszyny, komputera, który wykonuje dany algorytm, który powinien składać się z akcji podstawowych. Szczegółowość algorytmu w dużej mierze zalezy od złożoności problemu, do którego rozwiązywania ma służyć. Idąc tym tropem nie trudno zauważyć, że nie tylko różnić się będą struktury algorytmu którego zadaniem bedzie dodawanie do siebie dwóch liczb będzie się różnić od struktury algorytmu liczacego wartość funkcji n!, ale także w różny sposób można przedstawić działanie jednego algorytmu, np. algorytmu szukającego NWD dwóch liczb: Przykład 1 - Odnajdywanie NWD dwóch liczb w sposób ”szkolny”, opisane szczegółowo Krok 1 Pobierz liczby a i b Krok 2 Wypisz czynniki pierwsze liczby a jako listę A Krok 3 Wypisz czynniki pierwsze liczby b jako listę B Krok 4 Utwórz listę liczb C, jako listę elementów wspólnych dla A i B 4 Krok 5 Oblicz c jako iloczyn elementów listy C, jesli lista jest pusta to c=1 Krok 6 Podaj wynik dodawania Krok 7 Zakończ pracę Przykład 2 - Algorytm Euklidesa [6], opisany w sposób o wiele mniej szczegółowy niż meta w Przykładzie 1 Krok 1 Oblicz c jako resztę z dzielenia a przez b Krok 2 Zastąp pozycję a liczbą b, a pozycję b liczbą c Krok 3 Jeżeli pozycja b=0, to szukane NWD=a, w przeciwnym wypadku wróć do Kroku 1 Jak widac, algorytm o małym poziomie szczegółowości będzie rozumiał polecenia o wiele bardziej skomplikowane, np. ”znajd NWD liczb a i b”, natomiast algorytm o wyższym poziomie szczegółowości będzie potrzebował, aby mu to polecenie krok po kroku ”wytłumaczyć”, ”rozpisać”. Przeciwieństwem poziomu szczegółowości jest poziom abstrakcji - im wyższy poziom abstrakcji, tym niższy poziom sczegółowości danego algorytmu, tym bardziej skompliowane polecenia algorytm ”rozumie”. Często konstruując algorytmy pisze się je na niskim poziomie szczegółowości, a potem dopiero uszczegóławia polecenia, które są złożone. 4 Czynności proste i strukturalne Czynności proste są podstawowymi składnikami programów (elementarnymi elementami języka, w którym programujemy),co oznacza, że nie zawierają w sobie żadnych dodatkowych instukcji. Przykładem może być instrukcja wprowadzenia danych, instrukcja przypisania itp. Czynności strukturalne natomiast zawierają w sobie czynności proste,na tej podstawie budowane są rekurencje, iteracje (instrukcje powtarzalne), czy instrukcje warunkowe. 5 Pojęcie procedury i funkcji Procedury i funkcje inaczej zwane sa podprogramami, czyli wydzielonymi częściami wykonującymi dane operacje. Służą one przede wszystkim do uproszczenia kodu programu głównego. Na ogół konstruując podprogram musimy dostosować opis podprogramu do struktury danych w naszym programie głównym. W częsci języków programowania nie wyróżnia się różnicy pomiędzy procedurami i funkcjami i nazywa się je ogólnie podprogramami. 5 W gruncie rzeczy, różnica między funkcjami i procdurami jest następująca: funkcja ma wykonywać obliczenia i zwracać jakąś wartość, nie powinna natomiast mieć żadnego innego wpływu na działanie programu (np. funkcja obliczająca pierwiastek kwadratowy), procedura natomiast nie zwraca żadnej wartości, zamiast tego wykonuje pewne działania (np. procedura czyszcząca ekran). W jezyku Pascal podprogramy wyglądają następująco: Jako procedura: procedureP rocedura({argumenty}); begin {instrukcjedowykonania} end; Jako funkcja: f unctionF unkcja({argumenty}) : integer; {typwartoscif unkcji} begin {instrukcjedowykonania(cialof unkcji)} end; Literatura [1] Thomas H. Cormen,Charles E. Leiserson, Ronald L. Rivest, Stein Clifford Wprowadzenie do algorytmów Warszawa 2001 [2] Maciej M. Sysło Algorytmy Warszawa 2002 [3] http://www.staff.amu.edu.pl/ psi [4] http://icis.pcz.pl/ olga/dydaktyka.html [5] http://www.nw.pwr.wroc.pl/ szczygiel/wyklady/ELPROG3.doc [6] http://www.pl.wikipedia.org/ 6