Rekurencja. Przygotowała: Agnieszka Reiter

Podobne dokumenty
12. Rekurencja. UWAGA Trzeba bardzo dokładnie ustalić <warunek>, żeby mieć pewność, że ciąg wywołań się zakończy.

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

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

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Programowanie - wykład 4

ALGORYTMY I STRUKTURY DANYCH

5. Rekurencja. Przykłady

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

Raport z projektu. Przedmiot: Algorytmy i struktury danych 1 Projekt: Wieża Hanoi Autor: Wojciech Topolski

funkcje rekurencyjne Wykład 12. Podstawy programowania (język C) Funkcje rekurencyjne (1) Funkcje rekurencyjne (2)

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

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

Wstęp do programowania

Algorytmy i Struktury Danych.

Programowanie komputerowe. Zajęcia 3

Programowanie obiektowe i C++ dla matematyków

Podstawy Informatyki

Rekurencja (rekursja)

Część 4 życie programu

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

Podstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne

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

Wstęp do programowania

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

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

Programowanie komputerowe. Zajęcia 2

C++ wprowadzanie zmiennych

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

I - Microsoft Visual Studio C++

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

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

Liczby całkowite i rzeczywiste

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

Wstęp do Informatyki

typ_zwracanej_wartości nazwa_funkcji(lista deklaracji argumentów) { ciało(treść) funkcji return Val; //zwracana wartość }

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

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

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

Programowanie komputerowe. Zajęcia 1

Wstęp do programowania

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

1. Rekurencje. Grzegorz Kosiorowski. Uniwersytet Ekonomiczny w Krakowie. zima 2016/2017

MACIERZE. Sobiesiak Łukasz Wilczyńska Małgorzata

5 Przygotował: mgr inż. Maciej Lasota

Rekurencja/rekursja. Iluzja istnienia wielu kopii tego samego algorytmu (aktywacji) Tylko jedna aktywacja jest aktywna w danej chwili

Algorytmy i struktury danych

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

Wyjątki (exceptions)

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

Programowanie Obiektowe i C++

Wstęp do informatyki- wykład 11 Funkcje

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

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

Struktura pliku projektu Console Application

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Algorytmy i Struktury Danych

Wstęp do informatyki- wykład 9 Funkcje

Programowanie strukturalne i obiektowe. Funkcje

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

Ciągi liczbowe. - oznacza, że a(1) = a 1, a(2) = a 2, a(n) = a n a 1, a 2, a 3, a 4,... a n a(n) a n

Funkcje i tablice. Elwira Wachowicz. 23 maja 2013

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

Algorytmy. wer Wojciech Myszka 30 listopada 2008

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

Analiza algorytmów zadania podstawowe

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Algorytmy, reprezentacja algorytmów.

Programowanie Proceduralne

Metody algortmiczne (Algorytmy Część IV)

Wstęp do programowania

Algorytmy i Struktury Danych.

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Techniki Programowania wskaźniki 2

Algorytm selekcji Hoare a. Łukasz Miemus

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Wstęp do programowania

Wstęp do Programowania, laboratorium 02

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

Schematy blokowe. Algorytmy Marek Pudełko

Proste programy w C++ zadania

Kontrola przebiegu programu

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

Ilość cyfr liczby naturalnej

TEMAT : KLASY POLIMORFIZM

Projektowanie algorytmów rekurencyjnych

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Laboratorium nr 1. i 2.

Technologie cyfrowe semestr letni 2018/2019

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 9 Rekurencja

Analiza algorytmów zadania podstawowe

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Podstawy Programowania

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

Wprowadzenie do programowania i programowanie obiektowe

SCHEMAT OCENIANIA poziom rozszerzony arkusz I

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

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Część 6. Funkcje, Rekurencja. Własne funkcje Ćwiczenia wykonane pisemnie (notatki w zeszycie)

Transkrypt:

Rekurencja Przygotowała: Agnieszka Reiter

Definicja Charakterystyczną cechą funkcji (procedury) rekurencyjnej jest to, że wywołuje ona samą siebie. Drugą cechą rekursji jest jej dziedzina, którą mogą być tylko liczby naturalne. Rekurencja jest sposobem programowania, w którym stosuje się procedury wywołujące same siebie. Ilość tych wywołań nie ma znaczenia, fakt wywołania jest podstawą do określenia algorytmu jako rekurencyjnego.

Po co nam jest rekurencja? Przede wszystkim dzięki niej łatwo jest wykonać wiele zadań, w których potrzeba jest wyników cząstkowych do obliczenia całości. Sztandarowym przykładem w zagadnieniu rekurencji jest liczenie silni (n!), lub nieco bardziej zaawansowany przykład liczenia n-tej wartości w ciągu Fibonacciego. Dla przypomnienia, ciąg Fibonacciego jest ciągiem, w którym każda następna wartość jest równa sumie dwóch poprzednich.

Algorytm silnia

ALGORYTM SILNI W J. PASCAL Function silnia(n:byte):word; Begin If n<1 then silnia:=1 else silnia:=silnia(n-1)*n; End;

Algorytm silni Często przytaczanym przykładem jest definicja funkcji obliczającej wartość silni long int SILNIA(int n) { if(n<1) return 1; } else return n * SILNIA(n-1);

Analiza Odwołanie się do funkcji wewnątrz tej samej funkcji następuje z parametrem o 1 mniejszym, niż oryginalnie podano. Dlatego kolejna wersja funkcji będzie liczyła wartość silni już tylko dla np. 5, podczas gdy początkowe wywołanie było dla 6. Kolejne poziomy wywołań funkcji SILNIA będą liczyły silnię dla coraz mniejszych wartości, aż do 0, a wtedy zwrócone zostanie 1. Potem, zwracane są kolejne wartości podczas wychodzenia z kolejnych poziomów wywołań, i wtedy właśnie będzie obliczana rzeczywista wartość (będą mnożone przez siebie kolejne liczby).

Przykład - silnia(6)

Uwaga Cechą charakterystyczną jest to, że funkcja wchodzi w kolejny poziom, aby obliczyć iloczyn podanego jej parametru oraz wartość (parametr-1). Dopiero w momencie powrotu z wywołań obliczane są rzeczywiste iloczyny, i wtedy też przeliczana jest wartość silni.

Ciąg fibonacciego Liczby naturalne tworzące ciąg o takiej własności, że kolejny wyraz (z wyjątkiem dwóch pierwszych) jest sumą dwóch poprzednich nazywa się liczbami Fibonacciego i pojawiają się w tak wielu sytuacjach, że wydaje się to niemożliwe. Podstawowy ciąg liczb Fibonacciego to: 1, 1, 2, 3, 5, 8,... Każda liczba w ciągu jest sumą dwóch poprzednich (poza pierwszą i drugą). Mamy więc do czynienia z ciągiem rekurencyjnym.

Występowanie Ciąg Fibonacciego można odnaleźć w wielu aspektach przyrody, ciąg taki opisuje np. liczbę pędów rośliny jednostajnie przyrastającej w latach. W słoneczniku możemy zaobserwować dwa układy linii spiralnych, wychodzących ze środka. Takie same spirale można zaobserwować na wielu innych roślinach ( np. kalafior, ananas). Liczby spiral występujących w tych roślinach są kolejnymi liczbami Fibonacciego.

Ciąg fibonacciego w j. Pascal Function fibonacci(n:byte):word; Begin If ((n=1) or (n=2)) then fibonacci:=1 Else fibonacci := fibonacci(n-1)+fibonacci(n-2); End;

Ciąg Fibonacciego C++ #include <iostream> using namespace std; int Fibonacci(int n) { if (n==1 n==2) return 1; else return Fibonacci(n-1) + Fibonacci(n-2); } int main() { int n; cout << "Podaj n= "; cin >> n; cout << n << " wyraz ciagu Fibonacciego to: " << Fibonacci(n) <<endl; system("pause>null"); return 0; }

Wieże HANOI Wieże Hanoi problem polegający na odbudowaniu, z zachowaniem kształtu, wieży z krążków o różnych średnicach (popularna dziecięca zabawka), przy czym podczas przekładania wolno się posługiwać buforem (reprezentowanym w tym przypadku przez dodatkowy słupek), jednak przy ogólnym założeniu, że nie wolno kłaść krążka o większej średnicy na mniejszy ani przekładać kilku krążków jednocześnie. Jest to przykład zadania, którego złożoność obliczeniowa wzrasta niezwykle szybko w miarę zwiększania parametru wejściowego, tj. liczby elementów wieży.

Dla 2 krążków: Rozwiązania Dla 3 krążków: rozwiązanie dla 3 krążków składa się z 7 ruchów: kolejne etapy to: przenieś krążek o najmniejszej średnicy na palik docelowy, krążek o średnicy większej przenieś na palik pomocniczy, krążek najmniejszy przenieś na palik pomocniczy, następnie krążek największy przenieś na palik docelowy a najmniejszy na źródłowy, na największym połóżśredni i potem najmniejszy, koniec

Wieża Hanoi Ułóż stos na trzecim patyku przestrzegając następujących reguł: - przesuwaj jeden krążek z wierzchu stosu, - nie kładź większego krążka na mniejszym. bufora Od lewej: słupek A z całą wieżą, pusty słupek B pełniący rolę i pusty słupek docelowy C

Wieża Hanoi Wynik końcowy Ruchy pośrednie

Algorytm Rozwiązanie rekurencyjne: 1. Zidentyfikuj największy krążek na nie swoim miejscu (=krążek N) 2. If daje się go przenieść na docelowy słupek Then przenieś Else 3. Podzadanie: ustaw (N 1)-krążkową wieżę na nie-docelowym słupku. 4. Skocz do punktu 1....

Rozwiązanie rekurencyjne Algorytm rekurencyjny składa się z następujących kroków: przenieś (rekurencyjnie) n-1 krążków ze słupka A na słupek B posługując się słupkiem C, przenieś jeden krążek ze słupka A na słupek C, przenieś (rekurencyjnie) n-1 krążków ze słupka B na słupek C posługując się słupkiem A

Implementacja w C++ #include <iostream> using namespace std; void hanoi(int n, char A, char B, char C) { // przekłada n krążków z A korzystając z B na C if (n > 0) { hanoi(n-1, A, C, B); cout << A << " -> " << C << endl; hanoi(n-1, B, A, C); } } int main(int argc, char *argv[]) { hanoi(3, 'A', 'B', 'C'); return 0; }