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



Podobne dokumenty
ALGORYTMY I STRUKTURY DANYCH

FUNKCJA REKURENCYJNA. function s(n:integer):integer; begin if (n>1) then s:=n*s(n-1); else s:=1; end;

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

Podstawy programowania. Wykład: 13. Rekurencja. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Rekurencja (rekursja)

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

Algorytm. a programowanie -

Wykład 4. Określimy teraz pewną ważną klasę pierścieni.

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno

Zadanie 1. Test (6 pkt) Zaznacz znakiem X w odpowiedniej kolumnie P lub F, która odpowiedź jest prawdziwa, a która fałszywa.

Technologie Informatyczne Wykład VII

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

Technologie informacyjne Wykład VII-IX

1 Wprowadzenie do algorytmiki

Algorytmy i struktury danych. Wykład 4

Programowanie w Baltie klasa VII

ZADANIE 1. Ważenie (14 pkt)

Podstawy programowania. Podstawy C# Przykłady algorytmów

Rekurencja. Przykład. Rozważmy ciąg

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Wieczorowe Studia Licencjackie Wrocław, Wykład nr 6 (w oparciu o notatki K. Lorysia, z modyfikacjami) Sito Eratostenesa

Wstęp do Informatyki

Algorytm Euklidesa. Największy wspólny dzielnik dla danych dwóch liczb całkowitych to największa liczba naturalna dzieląca każdą z nich bez reszty.

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

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

Laboratorium kryptograficzne dla licealistów 6

Informatyka wprowadzenie do algorytmów (II) dr hab. inż. Mikołaj Morzy

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

1. Liczby wymierne. x dla x 0 (wartością bezwzględną liczby nieujemnej jest ta sama liczba)

5. Rekurencja. Przykłady

EGZAMIN MATURALNY Z INFORMATYKI

2.8. Algorytmy, schematy, programy

Spis treści JĘZYK C - PRZEKAZYWANIE PARAMETRÓW DO FUNKCJI, REKURENCJA. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu

Zapis algorytmów: schematy blokowe i pseudokod 1

Największy wspólny dzielnik Algorytm Euklidesa (także rozszerzony) WZAiP1: Chińskie twierdzenie o resztach

Algorytm i złożoność obliczeniowa algorytmu

Wstęp do programowania

6. Pętle while. Przykłady

11. Blok ten jest blokiem: a. decyzyjnym b. końcowym c. operacyjnym

Treść wykładu. Pierścienie wielomianów. Dzielenie wielomianów i algorytm Euklidesa Pierścienie ilorazowe wielomianów

Podstawy algorytmiki i programowania - wykład 3 Funkcje rekurencyjne Wyszukiwanie liniowe i binarne w tablicy

Zadania do samodzielnego rozwiązania

Algorytmy i Struktury Danych

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

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

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

Algorytmy. wer Wojciech Myszka 30 listopada 2008

Wykład 1. Na początku zajmować się będziemy zbiorem liczb całkowitych

0 --> 5, 1 --> 7, 2 --> 9, 3 -->1, 4 --> 3, 5 --> 5, 6 --> 7, 7 --> 9, 8 --> 1, 9 --> 3.

Podprogramy. Procedury

EGZAMIN MATURALNY 2012 INFORMATYKA

Zapisywanie w wybranej notacji algorytmów z warunkami i iteracyjnych

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Algorytmy i język C++

Teoria liczb. Magdalena Lemańska. Magdalena Lemańska,

Zaprojektować i zaimplementować algorytm realizujący następujące zadanie.

Rekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

Wstęp do informatyki- wykład 1

Wprowadzenie do algorytmiki

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

Podstawy programowania Laboratorium. Ćwiczenie 2 Programowanie strukturalne podstawowe rodzaje instrukcji

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

Programowanie strukturalne i obiektowe. Funkcje

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

Wykład 8. Rekurencja. Iterować jest rzeczą ludzką, wykonywać rekursywnie boską. L. Peter Deutsch

Ciąg Fibonacciego jako szczególny przykład ciągu określonego rekurencyjnie. Przykłady rekurencji w informatyce

Wstęp do informatyki

EGZAMIN MATURALNY Z INFORMATYKI

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

Uniwersytet Kazimierza Wielkiego w Bydgoszczy Zespół Szkół nr 5 Mistrzostwa Sportowego XV Liceum Ogólnokształcące w Bydgoszczy

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

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

Programowanie komputerowe. Zajęcia 3

Laboratorium nr 1. i 2.

Podstawy Programowania C 02

EGZAMIN MATURALNY Z INFORMATYKI

Programowanie - wykład 4

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

PROGRAMOWANIE W PYTHONIE OD PIERWSZYCH KROKÓW

Metody algortmiczne (Algorytmy Część IV)

Programowanie w C/C++ Instrukcje - konstrukcje powtórka. LABORKA Piotr Ciskowski

Programowanie i techniki algorytmiczne

Algorytmy w teorii liczb

Warsztaty dla nauczycieli

Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny

Wstęp do programowania

Podstawy programowania funkcjonalnego

Zadanie 1. Potęgi (14 pkt)

Warunki logiczne instrukcja if

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

WHILE (wyrażenie) instrukcja;

Programowanie obiektowe i C++ dla matematyków

Scenariusz lekcji. Obliczanie NWD- algorytm Euklidesa.

PRÓBNY EGZAMIN MATURALNY Z INFORMATYKI STYCZEŃ POZIOM ROZSZERZONY Część I

Instrukcje pętli przykłady. Odgadywanie hasła. 1) Program pyta o hasło i podaje adres, gdy hasło poprawne lub komunikat o błędnym haśle.

Projektowanie algorytmów rekurencyjnych

Program telewizyjny emisji filmów w 4 stacjach telewizyjnych: Telewizja / stacja Film i godziny jego emisji Czas trwania emisji filmu

Transkrypt:

Instrukcja laboratoryjna 6 Podstawy programowania 2 Temat: Funkcje i procedury rekurencyjne Przygotował: mgr inż. Tomasz Michno Wstęp teoretyczny Rekurencja (inaczej nazywana rekursją, ang. recursion) oznacza odwoływanie się funkcji do samej siebie. Stosowana jest w matematyce, informatyce i logice. Najłatwiej jej działanie objaśnić na przykładach. Przykład. Algorytm Euklidesa na wyznaczanie największego wspólnego dzielnika (NWD) można zapisać za pomocą matematycznego równania: NWD(a,b)= a NWD(b,amod b) dla b=0 dla b gdzie: a, b liczby,dla których szukamy największego wspólnego dzielnika mod operator dzielenia modulo (reszta z dzielenia) założenie: a>= b Zapis w pseudokodzie mógłby wyglądać następująco: funkcja NWD(a, b : liczby) jeśli(b=0) wtedy zwróć a; jeśli(b >= ) wtedy zwróć NWD(b, a mod b); Ten sam algorytm w wersji iteracyjnej (bez rekurencji): funkcja NWD(a, b : liczby) powtarzaj w pętli dopóki b>0 zapamiętaj w zmiennej tymczasowej wartość zmiennej b b:=a mod b;

a:=zmienna tymczasowa zwróć a; Jak można zauważyć wersja iteracyjna algorytmu jest znacznie dłuższa i bardziej skomplikowana. Prześledźmy teraz działanie funkcji rekurencyjnej dla obliczenia NWD liczb 8 i 6: NWD(8, 6): Nr wywołania Wartość a Wartość b Wykonywane instrukcje 8 6 jeśli(6 >= ) wtedy zwróć NWD(6, 8 mod 6); oznacza to, że wywołujemy ponownie funkcję NWD(6, 2) i zwracamy jej wynik 2 6 2 jeśli(2 >= ) wtedy zwróć NWD(2, 6 mod 2); oznacza to, że wywołujemy ponownie funkcję NWD(2, 0) i zwracamy jej wynik 3 2 0 jeśli(b=0) wtedy zwróć a; funkcja zwraca wartość zmiennej a, czyli 2 Patrząc na tabelkę, można by napisać skrótowo przebieg wykonywanych operacji: NWD(8,6) = NWD(6,2) = NWD(2,0) = 2 Przykład 2 Obliczanie silni. Wzór na silnię można zapisać następująco: silnia(n)= n silnia(n ) dla n=0 dla n Wersja w pseudokodzie: funkcja silnia(n : liczba) jeśli (n=0) wtedy zwróć jeśli (n>=) wtedy zwróć n*silnia(n-)

Przykładowo chcemy obliczyć silnię dla n=3: Nr wywołania Wartość n Wykonywane instrukcje 3 jeśli (3>=) wtedy zwróć 3*silnia(2-) oznacza to wywołanie silnia(2) i pomożenie liczby którą zwróci przez 3 2 2 jeśli (2>=) wtedy zwróć 2*silnia(2-) oznacza to wywołanie silnia() i pomożenie liczby którą zwróci przez 2 3 jeśli (>=) wtedy zwróć *silnia(-) oznacza to wywołanie silnia(0) i pomożenie liczby którą zwróci przez 4 0 jeśli (n=0) wtedy zwróć Zapis w powyższej tabeli jest równoznaczny z zapisem matematycznym: 3!=3*2!=3*2*!=3*2**0!=3*2** funkcja silnia(3) jeśli (3>=) wtedy zwróć 3*silnia(2) 7 3*2=6 wynik=6 funkcja silnia(2) jeśli (2>=) wtedy zwróć 2*silnia() 6 2*=2 funkcja silnia() jeśli (>=) wtedy zwróć *silnia(0) 2 5 *= 3 funkcja silnia(0) jeśli (n=0) wtedy zwróć 4

Powyższy rysunek pokazuje, jak realizowane są wywołania rekurencyjne. Strzałki z czarnymi numerami pokazują kolejność operacji. Zielone liczby informują, jaką wartość zwraca funkcja. Na początku (w silnia(3)) następuje próba zwrócenia wartości 3*silnia(2). Program nie posiada informacji jaką wartość posiada silnia(2), dlatego odkłada na stosie miejsce, do którego ma wrócić i wywołuje funkcję silnia(2). W funkcji silnia(2) jest podobnie program nie posiada informacji na temat funkcji silnia(), dlatego ponownie odkłada na stos miejsce do którego ma wrócić i wywołuje funkcję silnia(). W funkcji silnia() występuje identyczna sytuacja. Po wywołaniu silnia(0) zwracana jest wartość, ponieważ było to ostatnie wywołanie rekurencyjne funkcji. Następnie ze stosu jest zdejmowane miejsce, do którego należy wrócić (silnia()). Obliczana jest wartość funkcji silnia(), czyli *silnia(0)=*. Następnie zdejmowane jest ze stosu kolejne miejsce, do którego należy wrócić (silnia(2)). Obliczana jest wartość silnia(2), czyli 2*silnia()=2*. Następnie kolejny raz jest zdejmowane ze stosu miejsce do którego należy wrócić (silnia(3)). Obliczana jest wartość silnia(3), czyli 3*silnia(2)=3*2=6. Ostatecznie zwracany jest wynik funkcji silnia(3)=6. Zalety i wady rekurencji Najważniejszymi zaletami rekurencji są znaczne skrócenie kodu oraz często łatwiejsze jego napisanie. Najpoważniejszą wadą rekurencji jest jednak duże użycie stosu każde wywołanie rekurencyjne powoduje odłożenie na stos nie tylko miejsca w kodzie, do którego należy wrócić, ale również wszystkich aktualnych wartości zmiennych. Przy wielu wywołaniach może nastąpić przepełnienie sterty i zakończenie programu z błędem. Dlatego należy pamiętać, aby wywołań rekurencyjnych nie było zbyt dużo. Dodatkowo zazwyczaj funkcje rekurencyjne są wolniejsze od ich odpowiedników iteracyjnych. 2 Zadania. Napisz program, który zliczy sumę określonej liczby elementów ciągu arytmetycznego. W tym celu napisz dwie wersje jedną z wykorzystaniem rekurencji i drugą bez niej. Porównaj wyniki obu funkcji oraz długość kodu potrzebnego na ich napisanie. Funkcję można zapisać poniższym wzorem matematycznym: suma(n, k,r)= n dla k= n+suma(n+r, k, r) dla k 2 gdzie: n pierwszy element w ciągu k liczba elementów do obliczenia r różnica ciągu

2. Napisz program, który będzie obliczał n-ty wyraz ciągu Fibonacciego według wzoru: 0 dla n=0 F(n)= dla n= F(n )+F (n 2) dla n> Utwórz dodatkowo wersję bez rekurencji, a następnie oblicz za pomocą obu wersji 20, 25 oraz 30 wyraz ciągu. Zaobserwuj co się dzieje, a następnie spróbuj wyjaśnić przyczyny. Wskazówka: Użyj typu longint, ponieważ liczby mogą wyjść poza zakres zwykłego typu integer. 3. Korzystając z programów z poprzednich laboratoriów, napisz funkcję rekurencyjną, która będzie wyszukiwała element w drzewie. Porównaj ją z wersją bez rekurencji. UWAGA! Pamiętaj o zapisywaniu kodów źródłowych przed uruchomieniem programu.