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

Podobne dokumenty
Składnia funkcji i Rekurencja w języku Haskell

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

Strategia "dziel i zwyciężaj"

HASKELL 2 R O Z D Z I A Ł 4 SKŁADNIA W FUNKCJACH R O Z D Z I A Ł 5 REKURENCJA. Learn You a Haskell for Great Good! Miran Lipovac

Sortowanie przez scalanie

Wprowadzenie do programowania

Efektywna metoda sortowania sortowanie przez scalanie

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

ALGORYTMY I STRUKTURY DANYCH

Teoretyczne podstawy informatyki

Rekurencja (rekursja)

7. Pętle for. Przykłady

Zaawansowane algorytmy i struktury danych

Paradygmaty programowania

WHILE (wyrażenie) instrukcja;

Programowanie w VB Proste algorytmy sortowania

Sortowanie - wybrane algorytmy

Wstęp do programowania

Programowanie funkcyjne wprowadzenie Specyfikacje formalne i programy funkcyjne

6. Pętle while. Przykłady

Teoretyczne podstawy informatyki

Sortowanie przez wstawianie Insertion Sort

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

Programowanie - wykład 4

WHILE (wyrażenie) instrukcja;

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

Zaawansowane algorytmy i struktury danych

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

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

Pętla for. Wynik działania programu:

Konstrukcje warunkowe Pętle

1 Podstawy c++ w pigułce.

Algorytmy i Struktury Danych

1 Podstawy c++ w pigułce.

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Poprawność semantyczna

Algorytmy sortujące i wyszukujące

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

Dynamiczne struktury danych

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

Algorytmy i struktury danych. Wykład 4

INFORMATYKA Z MERMIDONEM. Programowanie. Moduł 5 / Notatki

Definicja. Ciąg wejściowy: Funkcja uporządkowująca: Sortowanie polega na: a 1, a 2,, a n-1, a n. f(a 1 ) f(a 2 ) f(a n )

Zapisywanie algorytmów w języku programowania

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

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

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

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

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

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)!

Czas pracy: 60 minut

TEORETYCZNE PODSTAWY INFORMATYKI

Programowanie komputerowe. Zajęcia 3

Sortowanie danych. Jolanta Bachan. Podstawy programowania

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

Język C, tablice i funkcje (laboratorium, EE1-DI)

Podstawowe algorytmy i ich implementacje w C. Wykład 9

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

Liczby losowe i pętla while w języku Python

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

Definicje wyższego poziomu

1. Liczby i w zapisie zmiennoprzecinkowym przedstawia się następująco

Podstawy Programowania C++

Rekurencje. Jeśli algorytm zawiera wywołanie samego siebie, jego czas działania moŝe być określony rekurencją. Przykład: sortowanie przez scalanie:

Wyszukiwanie binarne

Wstęp do programowania

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

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

5. Rekurencja. Przykłady

Algorytmy i struktury danych. Co dziś? Tytułem przypomnienia metoda dziel i zwyciężaj. Wykład VIII Elementarne techniki algorytmiczne

Wskazówki dotyczące zmiennych, tablic i procedur 1

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

... (środowisko) minut

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

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

- - Ocena wykonaniu zad3. Brak zad3

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

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

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

Wstęp do programowania

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Algorytmy sortujące. sortowanie kubełkowe, sortowanie grzebieniowe

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

I. Podstawy języka C powtórka

1 Wprowadzenie do algorytmiki

Funkcje i tablice. Elwira Wachowicz. 23 maja 2013

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Pętle. Programowanie komputerowe

Wstęp do programowania

WYKŁAD 9. Algorytmy sortowania elementów zbioru (tablic) Programy: c4_1.c... c4_3.c. Tomasz Zieliński

Zapis algorytmów: schematy blokowe i pseudokod 1

Programowanie w języku C++ Podstawowe paradygmaty programowania

Podstawy programowania. Podstawy C# Tablice

2.8. Algorytmy, schematy, programy

4. Funkcje. Przykłady

Złożoność obliczeniowa zadania, zestaw 2

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

Podstawy algorytmiki i programowania - wykład 6 Sortowanie- algorytmy

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

Wykład 3. Metoda dziel i zwyciężaj

Transkrypt:

REKURENCJA W JĘZYKU HASKELL Autor: Walczak Michał

CZYM JEST REKURENCJA? Rekurencja zwana rekursją, polega na wywołaniu przez funkcję samej siebie. Algorytmy rekurencyjne zastępują w pewnym sensie iteracje. Zazwyczaj zadania rozwiązywane tą techniką są wolniejsze od iteracyjnego odpowiednika, natomiast rozwiązanie niektórych problemów jest znacznie wygodniejsze. Rekurencja jest często stosowana w matematyce. W języku Haskell nie istnieją takie instrukcje jak pętle, jest to związane z tym że nie jest możliwa zmiana wartości zmiennej. Implementacja powtarzających się czynności musiała zostać rozwiązana przez rekurencję.

Przykład zastosowania rekurencji Ciąg Fibonacci'ego F0=0 F1=1 Jest to ciąg, gdzie każdy kolejny wyraz ciągu jest sumą dwóch poprzednich. Dwa pierwsze elementy ciągu musimy wyznaczyć bez rekurencji. Fn=Fn-1+Fn-2, dla n 2 Początkowe wartości to: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,

Funkcja Maximum Implementacja w języku imperatywnym Najprawdopodobniej stworzylibyśmy zmienną, która przechowywałaby największą wartości oraz pętlę, która przy wykonywaniu sprawdzałaby kolejne elementy listy. Jeśli sprawdzany aktualnie element listy jest większy od aktualnej maksymalnej wartości, wtedy zapisalibyśmy ten element do naszej zmiennej. Kiedy pętla przestanie się wykonywać ostatni wynik jest naszym rozwiązaniem! Implementacja z użyciem rekurencji Funkcja dzieli listę na head i tail, aż do momentu otrzymania listy jednoelementowej i porównuje head, z maximum tail (czyli wywołuje funkcje maximum dla tail).

Implementacja w języku Haskell Pierwszy warunek końcowy zwraca błąd jeśli nasza lista jest pusta. W wypadku jeśli jest to lista jednoelementowa - wynikiem będzie ten jeden element. W trzecim warunku końcowym rozłączamy naszą listę na głowę i ogon. Używamy funkcji where w celu zdefiniowania funkcji maxtail, jako maximum reszty listy, a następnie sprawdzamy warunek (if) czy głowa jest większa od reszty listy. Jeśli tak- zwracamy głowę jako wynik. W innym wypadku zwracamy maximum reszty listy.

Przykład z użyciem funkcji maximum Weźmy tablicę liczb całkowitych [2,1,5]. Krok 1: Dzielimy tę tablicę na head(2) i tail(1,5) i wywołujemy funkcję maximum dla tail

Przykład z użyciem funkcji maximum Weźmy tablicę liczb całkowitych [2,1,5]. Krok 1: Dzielimy tę tablicę na head(2) i tail(1,5) i wywołujemy funkcję maximum dla tail Krok 2: Tail jest ponownie dzielony na head(1) i tail(5) w wyniku tego podziału mamy spełniony warunek końca rekurencji.

Przykład z użyciem funkcji maximum Weźmy tablicę liczb całkowitych [2,1,5]. Krok 1: Dzielimy tę tablicę na head(2) i tail(1,5) i wywołujemy funkcję maximum dla tail Krok 2: Tail jest ponownie dzielony na head(1) i tail(5) w wyniku tego podziału mamy spełniony warunek końca rekurencji. Krok 3: Porównujemy 1 i 5, funkcja zwraca nam 5.

Przykład z użyciem funkcji maximum Weźmy tablicę liczb całkowitych [2,1,5]. Krok 1: Dzielimy tę tablicę na head(2) i tail(1,5) i wywołujemy funkcję maximum dla tail Krok 2: Tail jest ponownie dzielony na head(1) i tail(5) w wyniku tego podziału mamy spełniony warunek końca rekurencji. Krok 3: Porównujemy 1 i 5, funkcja zwraca nam 5. Krok 4: Porównujemy wartość zwróconą w kroku 3 czyli 5 z head czyli 2. 5 jest większe od 2 zatem funkcja zwraca 5 jako największą wartość tablicy.

Czystszy zapis z użyciem funkcji max

Funkcja replicate Funkcja replikacja pobiera dwa argument z czego pierwszy to int który mówi o tym ile razy ma zostać powtórzony drugi argument funkcji. Wynikiem działania tej funkcji jest lista powtarzających się elementów. Przykładowe wywołanie funkcji: replicate 3 5 zwraca nam listę [5,5,5]

Funkcja Take Funkcja take jest to funkcja, która pobiera zadaną liczbę elementów z podanej tablicy. Przykładowe użycie funkcji take 3 [2, 1, 25, 3, 0, 5] Wynik [2,1,25] W tym przypadku wykorzystujemy n oraz od razu rozbijamy listę na znany nam już ogon i głowę. Bierzemy pierwszy element listy i łączymy go poprzez rekurencję (n-1) razy z pozostałymi elementami.

Funkcja reverse Jest to funkcja która zwraca odwróconą listę do listy podanej a argumencie funkcji Przykładowe użycie funkcji reverse [2,1,4] Wynik to [4,1,2]

Funkcja QuickSort Załóżmy, że mamy listę elementów typu Ord do posortowania. Najefektywniej można to osiągnąć za pomocą popularnego algorytmu QuickSort. W językach imperatywnych taki algorytm zajmować może nawet kilkanaście linijek kodu, a jego implementacja w Haskellu jest dużo krótsza i bardziej przejrzysta. Posortowaną listą nazywamy taką listę, której wszystkie elementy są mniejsze bądź równe największemu elementowi. Następnie zaczynając od pierwszej liczby sprawdzamy czy każda następna jest większa od poprzedniej.

Implementacja algorytmu QuickSort Warunek końca określa sytuację, kiedy do posortowania zostaje pusta lista (co jest równoznaczne z tym, że jest już posortowana). Elementy listy, które są mniejsze lub równe headowi są sortowane i umieszczane na początku listy, następnie wstawiany jest head, a po nim posortowane elementy większe lub równe headowi.

Podsumowanie Wykonaliśmy już trochę działań za pomocą rekurencji i powinniśmy zauważać już pewną zależność. Zazwyczaj definiujemy warunek końcowy, po czym definiujemy funkcję, która wykonuje operacje pomiędzy niektórymi elementami względem reszty. Nie ma znaczenia czy to jest drzewo, lista, czy inna struktura danych. Zazwyczaj warunkiem końcowym jest punkt, gdzie rekurencja traci sens (otrzymujemy ten sam wynik cały czas). W przypadku list, najczęściej warunkiem końcowym jest pusta lista. W przypadku drzew - jest to punkt bez żadnych dzieci. Żeby myśleć rekurencyjne za warunek końcowy musimy uznać moment, w którym rekurencja nie zostaje użyta. Musimy także pamiętać o danych, z których będziemy korzystać, rozłożeniu parametrów funkcji oraz momencie, w którym użyjemy rekurencji.