Rekurzivne metode. Posmatrajmo rekurzivan metod kojim u objektu listbox1 klase ListBox upisujemo sve prirodne brojeve od 1 do datog n.

Similar documents
pojedinačnom elementu niza se pristupa imeniza[indeks] indeks od 0 do n-1

Uvod u programiranje - vežbe. Kontrola toka izvršavanja programa

For. 1) program ispis; {ispisuje brojeve od 1 do 5 jedan ispod drugog} uses wincrt; var s,i:integer; begin for i:=1 to 5do writeln(i); end.

Programiranje III razred

... ; ako je a n parno. ; ako je a n neparno

namespace spojneice { public partial class Form1 : Form { public Form1() { InitializeComponent(); }

Učitati cio broj n i štampati njegovu recipročnu vrijednost. Ako je učitan broj 0, štampati 1/0.

b) program deljiv3; uses wincrt; var i:integer; begin i:=3; while i<100 do begin write(i:5); i:=i+3; end; end.

Osnove programskog jezika C# Čas 5. Delegati, događaji i interfejsi

NIZOVI.

PREDMET. Osnove Java Programiranja. Čas JAVADOC

x y = z Zadaci - procedure

Uputa: Zabranjeno je koristiti bilo kakva pomagala. Rje²enja pi²ete desno od zadatka. Predajete samo ovaj list.

Veverica (za ocene >=3)

I PISMENI ZADATAK III6 I GRUPA IME I PREZIME

Variable Neighborhood Descent - VND (Metoda promenljivog spusta)

Računarske osnove Interneta (SI3ROI, IR4ROI)

modifier returnvaluetype methodname(list of parameters) { // Method body; }

for i:=2 to n do if glasovi[i]>max then begin max:=glasovi[i]; k:=i {*promenljiva k ce cuvati indeks takmicara sa najvise glasova *} end;

Veliki računski zadaci mogu se razbiti u manje delove i time se omogućava ljudima da iskoriste ono što su neki drugi već uradili, umesto da počinju

VEŽBA 5 do while petlja, switch case

VB komande. Programiranje 1

/*#include <iostream> // Prvi zadatak sa integralnomg ispita

Programiranje III razred

Uvod u relacione baze podataka

Programiranje kroz aplikacije. Kontrola toka programa Nizovi

Ispit iz Programiranja 1

Fortran 90. Numeričke Metode DECEMBAR ĐURĐEVAC NATAŠA

Vidljivost TipPovratneVrednosti ImeFunkcije (NizParametara) { TeloFunkcije }

VHDLPrimeri Poglavlje5.doc

var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.Items.LoadFromFile('d:\brojevi.

Prirodno-matematički fakultet u Nišu Departman za fiziku. dr Dejan S. Aleksić Programiranje u fizici

Z1. Dati RDF graf predstavljen u JSON-LD sintaksi potrebno je grafički predstaviti u skladu sa RDF notacijom. (5 poena)

UNIVERZITET U BEOGRADU ELEKTROTEHNIČKI FAKULTET

Svi Java tipovi imaju ekvivalentan tip u jeziku Scala Većina Scala koda se direktno preslikava u odgovarajući Java konstrukt

KONTROLE IZBORA_- Kontrola ListBox

Univerzitet u Nišu Građevinsko-arhitektonski fakultet. 4. Ciklična algoritamska struktura 5. Jednodimenzionalno polje.

Osnove programskog jezika C# Čas 4. Nasledjivanje 2. deo

Uputstva za instaliranje čitača Datalogic Skorpio u operativnom sistemu Windows 7 i višim POM-NA-XX-46, V3.0

Vežbe - XII nedelja PHP Doc

Algoritmi i strukture podataka

Numerical Computation

Događaj koji se javlja u toku izvršenja programa i kvari normalno izvršenje. Kada se desi izuzetak, sistem pokušava da pronađe način da ga obradi.

Izrada VI laboratorijske vježbe

Programske paradigme Funkcionalna paradigma

GUI - događaji (Events) i izuzeci. Bojan Tomić

Uputstvo za korišćenje logrotate funkcije

Programiranje II Beleške za predavanja

UPUTSTVO ZA KORIŠĆENJE NOVOG SPINTER WEBMAIL-a

PRINCIPI SOFTVERSKOG INŽENJERSTVA TIM NAZIV_TIMA

Ovde će se raditi na funkcijama konverzija: konverzija tipa datuma u znak tip i obrnuto, konverzija broja u karakter tip i obrnuto

Dežurni nastavnik: Kolokvijum traje 1.5 sat, prvih sat vremena nije dozvoljeno napuštanje kolokvijuma. Upotreba literature nije dozvoljena.

Programiranje 1. Školska 2006/2007 godina. Matematički fakultet, Beograd

Sveučilište u Zagrebu Fakultet strojarstva i brodogradnje. WEB programiranje HTML & CSS

PRIJEMNI ISPIT IZ INFORMATIKE

SELECT CASE i FOR NEXT. Programiranje 1

OBJEKTNO ORIJENTISANO PROGRAMIRANJE

Uputstvo za podešavanje mail klijenta

Kada se pokrene forma da bude plave boje. Dugme Crtaj krugove da iscrtava slučajan broj N krugova istog poluprečnika r (1/4 visine forme) čiji su

NISKE (stringovi) u C-u: podsećanje. 1. Primer programa koji uvodi niske karaktera terminisane nulom

Uvod u programiranje

Sberbank Business Online na Mozilla FireFox

Internet programiranje JavaScript - školska 2017/2018

Mašinska vizija. Dr Nenad Jovičić tnt.etf.rs/~mv

Ugradjena promenljiva ans cuva poslednju vrednost koja nije dodeljena ni jednoj promenljivoj >> ans+3

Prva recenica. Druga recenica.

EL E E L M E EN E T N I PRO R GR G A R M A SKO K G G JEZ E I Z KA A C# C PROF DR SAŠA BOŠNJAK

2. Linijska algoritamska struktura

PVC Eco. Eco Prozori i Balkonska Vrata Bela Boja Dezeni drveta su 40% skuplji

Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R.

Programiranje 1 Programski jezik C 2. čas. Mirko Spasić

PVC Eco. Eco Prozori i Balkonska Vrata Bela Boja Dezeni drveta su 40% skuplji

public static void main(string []args) { System.out.println("Hello World"); /* prints Hello World */

PROGRAMIRANJE. Teme. Packages Reference objekata Inheritance nasljeđivanje Exceptions. Amir Hajdar

[] znači opciono; znači ili. Strana 3 od 5

24/03/2018. Deklaracija promenljivih. Inicijalizacija promenljivih. Deklaracija i inicijalizacija promenljivih

Objektno orijentisano programiranje

VRIJEDNOSTI ATRIBUTA

12. Uskladištene procedure (Stored Procedures)

silaznom parsiranju uzlaznom parsiranju niz izvođenja stabla parsiranja s leva s desna

Informacioni sistemi i baze podataka

Windows Server 2012, VDI Licenciranje najprodavanijeg servera, što je novo, VDI licenciranje. Office 2013 / Office 365

PITANJA ZA II KOLOKVIJUM NASLJEĐIVANJE, VIRTUELNE FUNKCIJE I POLIMORFIZAM

Naredbe za kontrolu toka

Uvod u programiranje I (za gimnazijalce)

Proširena stvarnost - Augmented Reality (AR) Dr Nenad Gligorić

CSS CSS. selector { property: value; } 3/20/2018. CSS: Cascading Style Sheets

1/42 SQL DDL. CREATE ALTER DROP Schema Table Tablespace Index View Domain Constraint... DECLARE TABLE (DB2)

operativni sistem part 2

PROGRAMIRANJE INTERNET APLIKACIJA

import java.applet.applet; import java.applet.audioclip; import java.net.url; public class Vjesala2 {

Aspektno programiranje u Javi. AOP + AspectJ

Tema 8: Koncepti i teorije relevantne za donošenje odluka (VEŽBE)

Java Server Pages. 31-Dec-12

Programiranje II Beleške za predavanja

Besplatni softverski alati

Programski jezik JAVA PREDAVANJE

Programiranje Programski jezik C. Sadržaj. Datoteke. prof.dr.sc. Ivo Ipšić 2009/2010

Predavanje Projektovanje softvera - Niti. Sadržaj:

IV SQL. Slika 1. SQL*Plus ikona. Slika 2. Dijalog provere identifikacije korisnika. Slika 3. Prozor SQL*Plus programa

Transcription:

Rekurzivne metode Rekurzivan metod je onaj metod koji u nekoj svojoj instrukciji sadrži poziv samog sebe. Svakako prilikom kreiranja rekurzivnog metoda moramo voditi računa da ne dodje do beskonačne rekurzije (System.StackOverflow).Uvek moramo imati proveru da li je ispunjen uslov za napuštanje rekurzije (ili da li je ispunjen uslov za dalji ulazak u rekurziju). Posmatrajmo rekurzivan metod kojim u objektu listbox1 klase ListBox upisujemo sve prirodne brojeve od 1 do datog n. void pisi(int n) if (n > 1) pisi(n - 1); pisi(3) if (n > 1) pisi(n - 1); pisiid(2) pisi(2) if > 1) pisi(n - 1); if > 1) pisiid(n - 1); pisiid(1) pisi(1) n=1 if > 1) pisi(n - 1); if > 1) pisiid(n - 1); Analizirajmo izvršavanje ovog metoza kada ga pozovemo za, pisi(3). Prvo se proverava uslov 3>1 kako je uslov ispunjen realizuje se poziv metode pisi(2). To prouzrokuje kreiranje drugog primera metode pisiid sa lokalnom promenljivom n čija je vrednost 2. U drugom primerku ponovo se izvrši prva naredba, proverava uslov i poziva se metod pisi sada sa parametrom 1, pisi(1). To prouzrokuje kreiranje trećeg primerka metode u kojem lokalna promenljiva n

ima vrednost 1. U trećem primerku prvo se proverava uslov 1>1, kako on nije ispunjen ne vrši se poziv metode pisi, veće se izvršava treća naredba, a to je prikaz u objektu listbox1 vrednosti promenljive n koja iznosi 1. Na taj način sve naredbe trećeg primerka metode su izvršene, time je treći primerak metode završen, aplikacija se nastavlja od mesta poziva, to znači da se vraćamo u drugom primerku metode i izvršava se poslednja naredba u drugom primerku prikaz broja n u objektu listbox1, vrednost promenljive n je u drugom primerku 2. Po završetku drugog primerka vraćamo se na mesto poziva u prvom primerku što prouzrokuje prikaz vrednosti promenljive n (3) u objektu listbox1. Tako da je sadržaj objekta listbox1 redom 3 2 1 1 2 3 Lokalne promenljive svakog primerka metode čuvaju se na steku (stack). Stek je memorijski segment za privremeno čuvanje podataka, radi po LIFO principu (LastInFirstOut ) poslednji stavljen podatak prvi će se uzimati sa steka. Kada se pozove metod njeni parametri i lokane promenljive smeštaju se na stek, a kad se metod završi uzimaju se sa steka. n=1 Prilikom rešavanja nekog problema rekurzijom, uočimo potproblem istog tipa (ali manje dimenzije) rešimo taj potproblem pozivom rekurzivne metode i onda njegovo rešenje iskoristimo da dobijemo rešenje polaznog problema. Pri tome kada je polazni problem jednostavan (ne sadrži potproblem istog tipa) rešim ga bez poziva rekurzivne metode. U prethodnom primeru prilikom ispisa brojeva od 1 do n, rešimo podproblem za ispis brojeva od 1 do n-1 (ako je n manje ili jednako sa 1 potproblem ne postiji i ne pozivamo njegove rešavanje) pa upišemo broj n n=1

Važno je napomenuti da prethodni primer može da se reši značajno efikasnije iterativno: for (int i = 0; i < n; i++) listbox1.items.add(i); Zadatke koji slede rešabamo rekurzijom da bi naučili takav način razmišljanja i rešavanja, bez obzira što se većina tih zadataka može rešiti iterativno. 1. Napisati rekurzivnu metodu kojom se za dati prirodan broj n ispisuju brojevi 1, 2, 3,..., n a) prvo u inverznom poretku a zatim u direktnom b) prvo u direktnom a zatim u inverznom poretku void rekurzija1( int i,int n) listbox1.items.add(i); if (i < n) rekurzija1(i + 1, n); listbox1.items.add(i); void rekurzija2(int n) if (n > 1) rekurzija2(n - 1); private void numericupdown1_valuechanged(object sender, EventArgs e) int n = (int)numericupdown1.value; listbox1.items.clear(); if (radiobutton1.checked) rekurzija1(1, n); rekurzija2(n);

2. Napisati rekurzivni metod koja za dati prirodan broj n određuje a) broj cifra broja n b) sumu cifara broja n Prvi način int brojcifara(int n) return 1 + brojcifara(n / 10); int sumacifara(int n) return n % 10 + sumacifara(n / 10); private void button2_click(object sender, EventArgs e) label1.text = "Suma cifara je " + sumacifara(convert.toint32(textbox1.text)); label2.text = "Broj cifara je " + brojcifara(convert.toint32(textbox1.text)); Drugi način void brojcifara(int n, out int b) if (n < 10) b = 1; brojcifara(n / 10, out b); b++; void sumacifara(int n, out int s) if (n == 0) s = 0; sumacifara(n / 10, out s); s += n % 10; private void button1_click(object sender, EventArgs e) int s,b;

sumacifara(convert.toint32(textbox1.text),out s); label1.text = "Suma cifara je "+s; brojcifara(convert.toint32(textbox1.text), out b); label2.text = "Broj cifara je " + b; 3. Napisati rekurzivni metod koja za dati prirodan broj n određuje suma parnih cifara int sumap(int n) if ((n % 10) % 2 == 0) return sumap(n / 10) + n % 10; return sumap(n / 10); private void button3_click(object sender, EventArgs e) int n = Convert.ToInt32(textBox1.Text); int s; s = sumap(n); label1.text = "suma parnih je " + s; 4. Napisati rekurzivni metod koja za dati prirodan broj n određuje a) odredjivanje k-te cifre gledano s desna u levo u broju n int KCifra(int n, int k) if (k == 1) return n % 10; return KCifra(n / 10, k - 1); b) odredjivanje k-te cifre gledano s leva na desno u broju n // s leva na desno int cifrak2(int n, int k) if (n<math.pow(10,k)) return n % 10; return cifrak2(n / 10, k); // s leva na desno int cifrak22(int n, int stk) if (n < stk) return n % 10; return cifrak2(n / 10, stk); Poziv: cifrak22(n,math.pow(10,k))

5. Napisati rekurzivni metod koja za dati prirodan broj n određuje a) broj dobijem tako što se svaka parna cifra podeli sa 2 void podeliparnec(int n, ref int st, ref int x) if (n!= 0) if(n%10%2==0) x = x + n % 10/2 * st; x = x + n % 10 * st; st *= 10; podeliparnec(n / 10, ref st, ref x); int podeliparnec(int n) if (n % 10 % 2 == 0) return podeliparnec(n/10)*10+ n % 10 / 2; return podeliparnec(n/10)*10+ n % 10; b) broj dobijem tako izbacivanjem svake neparne cifre u broju n int izbacineparne(int n) if (n % 10 % 2 == 0) return izbacineparne(n / 10) * 10 + n % 10 ; return izbacineparne(n / 10);