ALGORYTMY ITERACYJNE

Podobne dokumenty
1 Podstawy c++ w pigułce.

Algorytmika i programowanie. dr inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

Wstęp do programowania

Pętla for. Wynik działania programu:

Wykład IV Algorytmy metody prezentacji i zapisu Rzut oka na język PASCAL

Algorytm. a programowanie -

2.8. Algorytmy, schematy, programy

1 Wprowadzenie do algorytmiki

Pętle. Dodał Administrator niedziela, 14 marzec :27

Podstawy Programowania Algorytmy i programowanie

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 1. Karol Tarnowski A-1 p.

Wstęp do programowania

1 Podstawy c++ w pigułce.

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Wstęp do informatyki- wykład 7

3. Instrukcje warunkowe

Programowanie komputerowe. Zajęcia 1

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

Iteracyjna realizacja wybranych algorytmów

W języku C dostępne są trzy instrukcje, umożliwiające tworzenie pętli: for, while oraz do. for (w1;w2;w3) instrukcja

Wprowadzenie do algorytmiki

Algorytmy. Programowanie Proceduralne 1

Programowanie - wykład 4

Podstawy Programowania Podstawowa składnia języka C++

Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

4. Funkcje. Przykłady

Iteracje. Algorytm z iteracją to taki, w którym trzeba wielokrotnie powtarzać instrukcję, aby warunek został spełniony.

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

Konstrukcje warunkowe Pętle

Ilość cyfr liczby naturalnej

Struktura pliku projektu Console Application

Programowanie proceduralne INP001210WL rok akademicki 2017/18 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Definicja algorytmu brzmi:

Algorytmy. Programowanie Proceduralne 1

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

Wstęp do programowania

Algorytm - pojęcie algorytmu, sposób zapisu, poziom szczegółowości, czynności proste i strukturalne. Pojęcie procedury i funkcji.

Algorytmy i struktury danych. Wykład 4

Algorytmy, reprezentacja algorytmów.

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Podstawy programowania skrót z wykładów:

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Podstawy Programowania

Języki programowania zasady ich tworzenia

Jak zawsze wyjdziemy od terminologii. While oznacza dopóki, podczas gdy. Pętla while jest

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Programowanie proceduralne w języku C++ Pętle, tablice

Opis problemu i przedstawienie sposobu jego rozwiązania w postaci graficznej. Gimnazjum nr 3 im. Jana Pawła II w Hrubieszowie 1

Kontrola przebiegu programu

a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10]

7. Pętle for. Przykłady

Wyszukiwanie największej spośród czterech liczb. Przykładowe rozwiązanie

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Definicje. Algorytm to:

Wstęp do Informatyki

Rekurencja (rekursja)

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

INFORMATYKA. Algorytmy.

Wykład I Cyfrowa reprezentacja informacji Algorytmy metody prezentacji i zapisu Tablice (wstęp) Rzut okiem na języki programowania

do instrukcja while (wyrażenie);

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Język C zajęcia nr 5

Luty 2001 Algorytmy (7) 2000/2001

Zapis algorytmów: schematy blokowe i pseudokod 1

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

TEMAT: Podejmowanie decyzji w programie instrukcja warunkowa (IF).

for (inicjacja_warunkow_poczatkowych; wyrazenie_warunkowe; wyrazenie_zwiekszajace) { blok instrukcji; }

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Pętle. for, while, do... while, foreach. Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.

Wstęp do programowania

Rekurencja. Przygotowała: Agnieszka Reiter

5. Rekurencja. Przykłady

Wykład I Cyfrowa reprezentacja informacji Algorytmy metody prezentacji i zapisu

Pascal - wprowadzenie

Poprawność semantyczna

Programowanie strukturalne i obiektowe. Funkcje

Pętla for. Matematyka dla ciekawych świata -19- Scilab. for i=1:10... end. for k=4:-1:1... end. k=3 k=4. k=1. k=2

6. Pętle while. Przykłady

Programowanie od pierwszoklasisty do maturzysty. Grażyna Koba

Znajdowanie największego i najmniejszego elementu w zbiorze n liczb całkowitych

Programowanie w języku Python. Grażyna Koba

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

ALGORYTMY MATEMATYCZNE Ćwiczenie 1 Na podstawie schematu blokowego pewnego algorytmu (rys 1), napisz listę kroków tego algorytmu:

Język ludzki kod maszynowy

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Prof. Danuta Makowiec Instytut Fizyki Teoretycznej i Astrofizyki pok. 353, tel danuta.makowiec at gmail.com

Język C część 2. Podejmowanie decyzji w programie. if else. switch

Podstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno

Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

Podstawy Programowania C++

Część 4 życie programu

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

Algorytmy komputerowe. dr inŝ. Jarosław Forenc

Algorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

Programowanie w języku C++ Grażyna Koba

Wstęp do informatyki- wykład 6

Wstęp do informatyki- wykład 2

tablica: dane_liczbowe

Transkrypt:

ALGORYTMY ITERACYJNE Jarosław Henke 19.11.2016 Tytuł niniejszego opracowania złożony jest z dwóch tajemniczo brzmiących słów, które niczym tantum verde w reklamie leków sprawiają, iż zagadnienie wydaje się być magicznym i skomplikowanym. Świat współczesnej techniki, szczególnie świat IT wytworzył specyficzny język, którego trudno by szukać w literaturze pięknej. Nowe słowa podobnie jak podstawowa wiedza z zakresu nowych technologii stanowią nowe elementy tego, co zwykłem nazywać pakietem inteligenta. W tym przypadku inteligenta technicznego. Spróbujmy zatem wejść do owego świata, no może nie całego lecz do fragmentu zawartego w tytule i zgłębić jego przestrzeń. Poznajmy nie tylko znaczenie tytułowych pojęć ale także to, co się pod nimi kryje. Tekst dedykuję Karolowi, z którym odbyliśmy spacer po wspomnianej przestrzeni kiedy zdobywał swoje pierwsze zawodowe szlify technika informatyka. Algorytm Pochodzenia słowa algorytm trudno doszukiwać się w powiązaniu ze słowami, które dziś z tym słowem kojarzymy. Wiele słów pochodzi od słowa algorytm: np. Algol język programowania, algorytmiczny czyli zgodny ze schematem działania itd. Słowo algorytm jest zatem wyrażeniem pierwotnym. Pochodzi tak naprawdę od fragmentu nazwiska Muhammad ibn Musa al-chorezmi arabskiego matematyka i astronoma z przełomu VIII i IX wieku. Uważa się go za pierwszego, który stosował metody obliczeniowe w matematyce. Od fragmentu tytułu jego dzieła pochodzi też słowo algebra. Ten właśnie mędrzec upowszechnił dziesiętny system liczenia i stosowanie zera. Pojęcie algorytm oznacza przepis, instrukcję krok po kroku prowadząca do rozwiązania problemu, lub osiągnięcia jakiegoś celu. Algorytm pozwala na systematyczne podejście do rozwiązywania typowych problemów nie tylko matematycznych. Ktoś, kto raz prawidłowo rozwiązał problem, ustanowił przepis na wykonanie określonego zadania, czy dojście do określonego celu jest w stanie zapisać to w standardowy sposób i przechowywać w celu późniejszego ponownego użycia przez siebie lub innych. Takie podejście rozwinęło dyscyplinę naukową zwaną algorytmiką. Pojęcia algorytmika jako dziedziny zajmującej się algorytmami i ich właściwościami po raz pierwszy użył Dawid Harel w swojej książce zatytułowanej Rzecz o istocie informatyki algorytmika. Jednym z najstarszych historycznie algorytmów liczącym ponad 2000 lat jest Algorytm Euklidesa znajdujący największy wspólny dzielnik dwóch liczb, który do dziś znajduje zastosowanie w rozwiązywaniu wielu problemów matematycznych. 1

Sposoby reprezentowania algorytmów Opis słowny Opis słowny jest stosowany zwykle w przypadku ustnie wydawanych poleceń. Na przykład kiedy uczymy kogoś wykonywać jakąś czynność. W zapisie najczęściej jest przepisem na potrawę. (weź 1 kg mąki, wsyp do makutry, wbij 4 jaja, dodaj pół kostki masła, 1 łyżeczkę proszku do pieczenia i utrzyj na jednolitą masę itd.) Lista kroków Wyobraźmy sobie funkcję sgn(x) (signum - znak), która działa tak: 1; dla x < 0 sign(x)= 0; dla x = 0 1; dla x > 0 Dziedziną tej funkcji jest zbiór liczb rzeczywistych, zaś wynik określony powyższym wzorem standardowy zapis listy kroków wygląda w sposób następujący 1 : Algorytm obliczania wartości funkcji f(x)=sign(x) Dane: dowolna liczba rzeczywista. Wynik: wartość funkcji f(x)=sign(x). Krok 0: Wczytaj wartość danej x. Krok 1: Jeśli x>0, to f(x) = 1. Zakończ algorytm. Krok 2: (W tym przypadku x 0) Jeśli x=0, to f(x)=1. Zakończ algorytm. Krok 3: (W tym przypadku x < 0)f(x)=-1. Zakończ algorytm. Schemat blokowy Schemat blokowy algorytmu, to specyficzny, graficzny język zapisu kroków. Składa się z następujących typów tzw. skrzynek (bloków, boxów, pudełek): Skrzynka ograniczenia (terminator). W jej wnętrzu wpisujemy słowa START (begin) lub STOP (end). Skrzynka wejścia/wyjścia. W jej wnętrzu wpisujemy polecenia typu: wprowadź x, Drukuj f(x) Skrzynka operacyjna. W jej wnętrzu wpisujemy formułę operacji do przeprowadzenia. Np. f(x):=1. Skrzynka decyzyjna. W jej wnętrzu wpisujemy warunek logiczny przyjmujący wartość TRUE lub FALSE (np. x>0). Ta skrzynka pozwala na rozgałęzienie algorytmu. Z jednego z narożników rombu wychodzi strzałka gdy warunek logiczny przyjmuje wartość True, z innego zaś gdy przyjmuje wartość False. Strzałka. Łączy poszczególne skrzynki algorytmu wytyczając ścieżkę działania. 1 Przykład pochodzi z książki Maciej M. Sysło Algorytmy, WSiP 2002 2

Nasz algorytm przyjmie zatem następujący schemat logiczny: START We: x X > 0 tak f(x) := 1 X = 0 tak f(x) := 0 f(x) := -1 Wy: f(x) STOP Drzewo algorytmu Drzewo algorytmu, to schemat blokowy przyjmujący postać drzewa obliczeń. Drzewo rozpoczyna się od wspólnego korzenia, a następnie drogi obliczeń rozgałęziają się tak, by się więcej nie spotkać. W drzewie obliczeń z reguły pomija się operacje wejścia/wyjścia. 3

tak x>0 nie f(x) = 1 x=0 tak nie f(x) = 0 f(x)=-1 Pseudokod Częstym i chętnie stosowanym szczególnie przez teoretyków jest zapis algorytmu w tzw. pseudokodzie. Jest to coś pośredniego miedzy listą kroków, a tabulogramem w konkretnym języku programowania. Nie istnieje jakiś ściśle określony standard. Pisanie w pseudokodzie polega na formułowaniu reguł postepowania za pomocą składni zbliżonej do języka programowania bez szczegółów implementacyjnych i często bez zachowania właściwej składni. Najczęściej składnia przypomina Basic, Pascal czy C++ lub wręcz stosuje się określenia spoza języków programowania w rodzaju jeśli, to, w przeciwnym wypadku, wykonaj itd. Algorytm obliczania wartości funkcji f(x)=sign(x) Dane: dowolna liczba rzeczywista. Wynik: wartość funkcji f(x)=sign(x). 1. BEGIN 2. Input x. 3. If x>0 then f(x):=1 else begin 4. If x=0 then f(x):=0 else f(x):=-1 end 5. Output f(x) 6. END. Kod w konkretnym języku programowania Pełna implementacja algorytmu najczęściej w formie modułu lub funkcji bibliotecznej. Oto nasz przykład w języku Pascal, a po nim w C++: program Signum; Program wczytuje liczbe x i drukuje na ekranie wartość funkcji f=signum(x). var x: real; begin read(x); if x>0 then write(1) else if x=0 then write(0) else write(-1) end. Signum 4

#include <stdio.h> main() float x; printf( Podaj liczbę x: ); scanf( %f,&x); if(x>0) printf( sgn(x)=1 ); else if(x==0) printf( sgn(x)=0 ); else printf( sgn(x)=-1 ); Iteracja Słowo iteracja pochodzi z języka łacińskiego. Iteratio oznacza powtarzanie. Pojęcie iteracja w sensie informatycznym będzie miało zatem związek z powtarzaniem fragmentu programu w kółko, mówimy - w pętli iteracyjnej. Iteracją nazywamy tu pojedynczy cykl w zapętlonej części programu. Ilość iteracji można zadać poprzez ustawienie tzw. licznika iteracji lub kazać wykonywać program w kółko aż do osiągnięcia warunku wyjścia z pętli. Warunkiem może być zarówno wartość zmiennej obliczanej wewnątrz pętli jak i dowolny czynnik sprawdzany programowo. Np. wduszenie klawisza, zmiana ustawienia semafora itd. Sprawdzenie warunku może następować zarówno na początku iteracji jak i po jej wykonaniu. W zależności od potrzeb popularne języki programowania dostarczają kilku standardowych metod iteracyjnych różniących się jednak składnią i funkcjonalnością. Do omówienia ich posłużymy się składnią języka C++. Pętla iteracyjna for Pętla for składa się ze słowa kluczowego for, i przypisanych do niej trzech definicji. for(zmiennasterująca; waruneklogiczny; zmianazmiennejsterujacej) instrukcja; lub lista instrukcji ujęta w nawiasy klamrowe zmiennasterująca - zmienna typu całkowitoliczbowego zadeklarowana i zainicjowana globalnie bądź wewnątrz instrukcji for. W tym drugim przypadku nie ma do niej dostępu na zewnątrz pętli. waruneklogiczny wyrażenie logiczne będące funkcją zmiennej sterującej. W pierwszym kroku iteracji zostaje sprawdzony warunek logiczny. Jeśli ma wartość TRUE wykonują się instrukcje należące do pętli po czym następuje wykonanie zmiany zmiennej sterującej i powrót do sprawdzenia warunku. 5

zmianazmiennejsterujacej wyrażenie zmieniające wartość zmiennej sterującej. Najczęściej jest to zwykła inkrementacja typu ++X lub dekrementacja --X 2 przy czym w tym zastosowaniu nie ma znaczenia czy piszemy plusy lub minusy przed czy za zmienną. Choć ++X działa nieco szybciej niż x++. Oczywiście w tym miejscu może stać dowolne wyrażenie zmieniające zmienną np. x+=2. Ciekawostką i w sumie fajną cechą pętli for w C++ jest możliwość użycia kilku zmiennych sterujących i odpowiadających im wyrażeń zmieniających. Należy je wówczas oddzielać od siebie przecinkami. Oczywiście warunek logiczny musi być jeden ale może być funkcją wielu zmiennych. Pętla for może się nie wykonać ani razu jeśli wartości zmiennych sterujących inicjowane na zewnątrz nie spełnią warunku logicznego. Pętle można zagnieżdżać jedna w drugiej. Pętla iteracyjna do while Z tej pętli korzystamy kiedy nie jesteśmy w stanie określić liczby iteracji (powtórzeń). do instrukcja;... instrukcja; while(warunek logiczny); Jak widać nie ma tu zmiennej sterującej, więc o prawidłowo działający warunek logiczny programista musi zadbać sam. Iteracje będą się powtarzać jeśli warunek logiczny będzie spełniony przy czym pierwsza iteracja wykona się zawsze, bo warunek sprawdzany jest na końcu. Cechy tej nie posiada kolejna pętla iteracyjna opisana poniżej. Pętla iteracyjna while Działanie tej pętli przebiega podobnie jak w poprzednim przypadku. Brak wbudowanego jako parametr licznika iteracji, stwarza konieczność samodzielnego zaimplementowania prawidłowego warunku wyjścia z pętli. W tym przypadku warunek sprawdzany jest zanim zaczną być wykonywane instrukcje. Zatem podobnie jak to miało miejsce w przypadku for, pętla może się nie wykonać ani razu. while(warunek logiczny) instrukcja;.. 2 Inkrementacja i dekrementacja to odpowiednio zwiększenie lub zmniejszenie wartości zmiennej o 1. Przy czym ++X najpierw zwiększy a potem odczyta wartość zmiennej, zaś X++ najpierw odczyta, a potem zwiększy wartość zmiennej. Podobnie przy dekrementacji 6

. instrukcja; Instrukcje break i continue Jeśli chcemy zakończyć dowolną z pętli iteracyjnych z powodu wystąpienia jakiegoś innego warunku zdefiniowanego wewnątrz pętli np. przy pomocy instrukcji if, to z pomocą przychodzi nam słowo kluczowe break. Powoduje ono zakończenie działania pętli iteracyjnej i przejście do kolejnych kroków programu. nieco inaczej działa continue. powoduje pominięcie występujących po tym słowie instrukcji wewnątrz pętli i przejście do kolejnej iteracji. działanie tych instrukcji wyjaśnią zamieszczone poniżej przykłady. 3 #include <iostream> int main() for( int x = 0; x < 10; x++ ) if( x == 7 ) std::cout << "Teraz 'x' wynosi " << x << "." << std::endl; std::cout << "Przerywam petle!" << std::endl; break; std::cout << "x = " << x << std::endl; std::cout << "Teraz jestem tu :)" << std::endl; return 0; x = 0 x = 1 x = 2 x = 3 x = 4 x = 5 x = 6 Teraz 'x' wynosi 7. Przerywam petle! Teraz jestem tu :) 3 przykłady zaczerpnięte z http://cpp0x.pl/kursy/kurs-c++/poziom-3/slowa-kluczowe-continue-break/295 7

#include <iostream> int main() for( int x = 0; x < 8; x++ ) std::cout << "x = " << x << std::endl; if( x == 2 x == 3 x == 5 ) std::cout << "Teraz 'x' wynosi " << x; std::cout << " - wywoluje continue!" << std::endl; continue; std::cout << "KONIEC kroku x = " << x << std::endl; return 0; x = 0 KONIEC kroku x = 0 x = 1 KONIEC kroku x = 1 x = 2 Teraz 'x' wynosi 2 - wywoluje continue! x = 3 Teraz 'x' wynosi 3 - wywoluje continue! x = 4 KONIEC kroku x = 4 x = 5 Teraz 'x' wynosi 5 - wywoluje continue! x = 6 KONIEC kroku x = 6 x = 7 KONIEC kroku x = 7 8

Wybrane zagadnienia iteracyjne i ich przykładowe rozwiązania algorytmiczne Wybór wartości najmniejszej spośród n liczb Algorytm wyboru najmniejszej liczby spośród n liczb. Dane: int n - ilość wprowadzanych liczb, x i x n n-liczb rzeczywistych, zapamiętywanych kolejno w zmiennej x. Wynik: wartość elementu najmniejszego: min. Lista kroków: 1. Zacznij algorytm. 2. Wprowadź liczbę danych n->n. 3. Wprowadź pierwszą liczbę x 1->x. 4. Zmiennej min przypisz wartość liczby x: min := x. 5. Wprowadź kolejną liczbę x i->x 6. Porównaj x z min: x < min. 7. Jeśli x mniejsza od min, zastąp nią wartość zmiennej min: min:=x. 8. Jeśli nie jest to ostatnia liczba, wróć do kroku 5. 9. Wyprowadź wynik: min. 10. Zakończ algorytm Poniżej implementacje tego algorytmu w języku Pascal i C++ z zastosowaniem zdefiniowanej w programie funkcji MinN(liczbaElementów). 4 program Minimum; var LiczbaElementow, MinWartosc: integer; function MinN(n: integer): integer; var i, x, minx: integer; begin for i := 1 to n do begin Write('Podaj liczbę ', i, ': '); Readln(x); if i = 1 then minx := x else if x < minx then minx := x; end; MinN := minx; end; begin Write('Podaj liczbę elementów: '); Readln(LiczbaElementow); Writeln('Podaj elementy:'); 4 Przykłady pochodzą z książki: Grażyna Koba Informatyka dla szkół ponadgimnazjalnych - zakres rozszerzony, MiGra. 9

end. MinWartosc := MinN (LiczbaElementow); Writeln('Minimum to ', MinWartosc); #include <iostream> using namespace std; int LiczbaElementow, MinWartosc; int MinN(int n) int i, x, minx; for(i=0; i<n; i++) cout << "Podaj liczbe " << i+1 << ": "; cin >> x; if(i==0) minx = x; else return minx; int main() if(x<minx) minx = x; cout << "Podaj liczbe elementow: "; cin >> LiczbaElementow; cout << "Podaj elementy:" << endl; MinWartosc = MinN(LiczbaElementow); cout << "Minimum to " << MinWartosc << endl; return 0; Obliczanie n! (silnia) Silnia z liczby całkowitej n, to iloczyn n-czynników różniących się o 1, począwszy od 1 do n. Przy czym 0!=1 Poniżej implementacja algorytmu silnia w C++ #include<iostream> using namespace std; int main() int n, silnia = 1; cout << "Podaj liczbe: "; cin >> n; cout << n << "! = "; if (n == 0) cout << "1\n"; else while (n > 0) 10

return 0; silnia *= n; n--; cout << silnia << endl; Algorytm Euklidesa Służy do znajdowania największego wspólnego dzielnika dwóch liczb naturalnych NWD(a,b). Oto algorytm w wersji z odejmowaniem: Algorytm Euklidesa NWD(a,b) - wersja z odejmowaniem. Dane: dwie liczby naturalne: a, b. Wynik: wartość największego wspólnego dzielnika liczb a i b: NWD. Lista kroków: 1. Zacznij algorytm. 2. Wprowadź wartości liczb a i b. 3. Sprawdź, czy a jest różne od b. 4. Dopóki a nie jest równe b, powtarzaj punkt 5; w przeciwnym razie przejdź do punktu 6. 5. Od liczby większej odejmij mniejszą i liczbę większą zastąp otrzymaną różnicą. 6. Wyprowadź wynik: NWD jest równe pierwszej liczbie. 7. Zakończ algorytm. 11

W poprzedniej wersji odejmowanie posłużyło tak naprawdę znalezieniu reszty z dzielenia dwóch liczb. Zamiast odejmowania możemy zatem od razu zastosować dzielenie z resztą. Pisząc program w języku Pascal, należy wykorzystać operator mod w celu obliczania reszty z dzielenia, np. reszta := a mod b. W języku C++ należy zastosować operator %, np. reszta = a % b. Algorytm Euklidesa NWD(a,b) - wersja z dzieleniem. Dane: dwie liczby naturalne: a, b. Wynik: wartość największego wspólnego dzielnika liczb a i b: NWD. Lista kroków: 1. Zacznij algorytm. 2. Wprowadź wartości liczb a i b. 3. Zmiennej k przypisz wartość zmiennej b: k := b. 4. Zmiennej b przypisz wartość wyrażenia: a mod b: b:=a mod b. 5. Zmiennej a przypisz wartość zmiennej k: a := k. 6. Jeśli b<>0 przejdź do kroku 3. 7. Wyprowadź wynik: NWD jest równe a. 8. Zakończ algorytm. Jednoczesne znajdowanie największego i najmniejszego elementu w zbiorze Znalezienie wartości najmniejszego i największego elementu zbioru pozwala na określenie parametru zwanego rozpiętością zbioru. Jest to różnica między tymi dwoma wartościami. Naiwna metoda polegałaby na zastosowaniu algorytmu opisywanego już wcześniej. Znajdujemy element minimalny, czyli Pół zadania już rozwiązaliśmy. Następnie wyrzucamy ten element z rozpatrywanego zbioru i ponownie wyszukujemy element minimalny. Czynność powtarzamy aż w zbiorze pozostanie ostatni element. z pewnością będzie on posiadał wartość największą. Już intuicyjnie jednak czujemy, że wykonujemy tu nadmiarową ilość operacji co z całą pewnością rzutuje na tzw. koszt operacji. Stąd potrzeba wynalezienia innej metody. Optymalnym rozwiązaniem będzie tu metoda dziel i zwyciężaj. Dziel - czyli podziel zadanie na kilka mniejszych. Zwyciężaj - znajdź rozwiązanie dla każdego z podzadań osobno, a następnie porównaj wyniki. potrzebny jest oczywiście algorytm iteracyjny na znajdowanie elementu największego ale łatwo przerobić ten który przytoczyliśmy dla przypadku elementu najmniejszego. W przypadku kiedy mamy zbiór złożony z n elementów i zastosujemy metodę naiwną wykonamy n-1 porównań liczb poszukując wartości najmniejszej oraz n-2 porównań poszukując wartości największej. Czyli w sumie 2n-3 porównania. Dzieląc parzysty zbiór na pół na zasadzie weź dwie kolejne liczby i mniejszą z nich zakwalifikuj do zbioru A zaś większą do zbioru B, a następnie poszukując elementów największych i najmniejszych metodą iteracyjna w każdym z podzbiorów osobno wykonamy: n/2 porównań podczas dzielenia zbioru 12

n/2-1 porównań szukając najmniejszego w zbiorze mniejszych n/2-1 porównań szukając największego w zbiorze większych Razem 3n/2-2 porównania. dla 100 elementowego zbioru w pierwszym przypadku (metoda naiwna) mamy 197 porównań, w drugim (dziel i zwyciężaj) 148. Jeśli ilość elementów zbioru jest nieparzysta, ostatni element zostaje i jest porównywany na końcu. Dochodzą zatem dwa dodatkowe porównania. Liczba porównań dla n nieparzystego wynosi zatem 3n/2. Liczby Fibonacciego Jedną z ciekawostek matematycznych jest zagadnienie rozmnażania się królików. Problemem tym zajął się włoski matematyk okresu średniowiecza (1202r) Leonardo Pisano zwany Fibonaccim. Założenia są następujące: Mamy parę królików, która po miesiącu osiąga dojrzałość płciową, zachodzi w ciążę i po następnym miesiącu rodzi się para (różnej płci) królików. Od tej pory już co miesiąc rodzi się taka para. ich potomstwo i potomstwo potomstwa itd. podlega tej samej regule. Należy policzyć ile królików będziemy mieli po n miesiącach od chwili początkowej. Ujmując sprawy w ramy matematyczne zagadnienie można zdefiniować następującym wzorem: 1, n 1,2 F n = F n 1 + F n 2, n 3 Iteracyjna metoda polega zatem na ręcznym wprowadzeniu pierwszych dwóch wyrazów (dla n = 1 i n = 2) a następnie sumowaniu. Czyli dla n 3 mamy n-2 iteracje. Schemat Hornera Schemat Hornera jest algorytmem służącym do szybkiego obliczania wartości wielomianu, a także przeliczania na postać dziesiętną liczb zapisanych w innym systemie liczbowym oraz szybkiego podnoszenia do potęgi. Weźmy wielomian n-tego stopnia postaci: W(x) = a0x n + a1x n-1 + a2x n-2 +...+ an-1x + an dla n 0. Można go przekształcić do postaci hornerowskiej: W(x) = ( (a0x + a1)x + a2)x +...+ an-1)x + an. Taka postać nadaje się do implementacji za pomocą pętli iteracyjnej. Główne kroki algorytmu zgodnego ze schematem Hornera schematem Hornera, można napisać następująco: W(x) := a 0 (początkowa wartość wielomianu) W(x) := W(x)x + a i dla i = 1, 2, 3,..., n 13 (iteracja). Danymi początkowymi będzie stopień wielomianu n oraz n-wymiarowa tablica współczynników a i.

Wartość wielomianu zostanie obliczona w n - iteracjach. Wydawanie reszty (metoda zachłanna) Na zakończenie algorytm wydawania reszty. Chodzi o to, żeby wydając resztę użyć jak najmniejszej ilości walorów czyli tak dobierać nominały i ich ilości aby sztuk pieniędzy było możliwie najmniej. Algorytm zachłanny algorytm, który w celu wyznaczenia rozwiązania w każdym kroku dokonuje zachłannego, tj. najkorzystniejszego w danym kroku, rozwiązania częściowego. Przepis słowny: Używane walory definiujemy w tablicy walorów W z której będziemy je pobierać do porównań. Kwotę, z której mamy wydać resztę wpisujemy do zmiennej R. Sprawdzamy czy w tabeli nominałów jest nominał nie większy niż R. Bierzemy największy możliwy nominał i dzielimy przez niego zmienną R. Część całkowita z tego dzielenia, to ilość użytych nominałów, którą zapamiętujemy w odpowiedniej tablicy skorelowanej z nominałami. Resztę z tego dzielenia przypisujemy zmiennej R i wracamy na początek pętli. Iteracje kończą się, gdy reszta z dzielenia wyniesie 0, lub (kwestia umowy) nie istnieje nominał nie większy niż reszta). 14

Spis treści Algorytm... 1 Sposoby reprezentowania algorytmów... 2 Opis słowny... 2 Lista kroków... 2 Schemat blokowy... 2 Drzewo algorytmu... 3 Pseudokod... 4 Kod w konkretnym języku programowania... 4 Iteracja... 5 Pętla iteracyjna for... 5 Pętla iteracyjna do while... 6 Pętla iteracyjna while... 6 Instrukcje break i continue... 7 Wybrane zagadnienia iteracyjne i ich przykładowe rozwiązania algorytmiczne... 9 Wybór wartości najmniejszej spośród n liczb... 9 Obliczanie n! (silnia)... 10 Algorytm Euklidesa... 11 Jednoczesne znajdowanie największego i najmniejszego elementu w zbiorze... 12 Liczby Fibonacciego... 13 Schemat Hornera... 13 Wydawanie reszty (metoda zachłanna)... 14 15