|
[ Jovan86 @ 05.09.2008. 16:14 ] @
| Da li neko moze najjednostavnije da mi objasni rekurziju za sledeci program.Pasce mi slican na ispitu pa bih hteo da znam kako da ga resim, i kako racunam koliko puta se pozvao metod m? hvala i
pozz.
Code:
class A public int m(int i) {
if (i<=1) return i;
return m(i-1) + 2*m(i-3);
}
}
//Pozivanje rekurzivnog metoda
A a=new A();
int i=a.m(6);
//i=?
Koliko puta se pozvao metod m?
[Ovu poruku je menjao Jovan86 dana 05.09.2008. u 17:25 GMT+1] |
[ Nikola Poša @ 05.09.2008. 16:25 ] @
Ti mora da idesh u Visoku ICT... :D
Evo ovako, kad preko ove linije koda: int i=a.m(6); pozovesh taj metod, ti mu prosledjujesh, u tom sluchaju, broj 6. Ovaj if sigurno nece proci, jer 6 nije manje ili jednako 1, pa ce se "otici" na ovaj donji return. Njega sada treba da posmatrash kao da imash dva zasebna dela: prvi je m(i-1), odnosno u ovom sluchaju m(5), i 2*m(i-3) odnosno 2*m(3). Sad se opet za ovaj prvi deo ulazi u taj metod, ali ovoga puta kao argument mu se prosledjuje broj 5. Opet nece proci uslov, i uci ce se u donji return, i tu opet dolazi na grananje u dva dela: m(5) i 2*m(2). Ovaj drugi deo ce da vrati ovo: m(2) + 2*m(0), i sad imash ovako neshto: m(5) + 2*m(2) + m(2) + 2*m(0). Ovaj poslednji ce da "udje" u ovaj prvi return, i vratice broj 1, tako da sada imash m(5) + 2*m(2) + m(2) + 1. Sad valjda znash i sam kako ide dalje, chista matematika... :)
[ Nikola Poša @ 05.09.2008. 17:31 ] @
Evo sad ceo postupak:
m(6) =
m(5) + 2*m(3) =
m(4) + 2*m(2) + 2*(m(2) + 2*m(0)) =
m(3) + 2*m(1) + 2*(m(1) + 2*m(-1)) + 2*(m(1) + 2*m(-1) + 0)) =
m(2) + 2*m(0) + 2 + 2*(1 - 2) + 2*(1 - 2 + 0) =
m(1) + 2*m(-1) + 0 + 2 - 2 - 2 =
1 - 2 + 2 - 2 - 2 =
-3
Rezultat je -3, a metod m() se poziva ukupno 17 puta.
[ mikicca @ 15.08.2009. 12:37 ] @
mene buni ovo
class A public int m(int i) {
if (i<=1) return 2;
return m(i-2) + 2*m(i-3)+1;
}
}
//Pozivanje rekurzivnog metoda
A a=new A();
int i=a.m(6);
//i=?
Sta da radim sa ovim return 2-tj da li utice na grananje???
a i ovaj...
class A public int m(int i) {
if (i>2) ;
return 2*m(i-1) + m(i-2)+2;
else
return 0;
}
}
//Pozivanje rekurzivnog metoda
A a=new A();
int i=a.m(5);
//i=?
Objasnite mi molim Vas da li if (i>2) znaci da grananje ide do m(2) i da svaki od njih vrati 1 ili sam ja to sve pogresno shvatila? I ova 2 sto mnozi m da li iznova mnozi ceo red kad zadajem za m=4?
[ Nikola Poša @ 15.08.2009. 13:37 ] @
Samo treba da čitaš kod, ništa više... Znam da ti to spremaš za ispit, al' nemoj napamet da učiš taj postupak.
Ova linija koda, startuje celu priču:
Code: int i = a.m(6);
Poziva se metod m(), i kao argument mu se prosleđuje 6. I sad čitaj kod tog metoda... Prvo ide if koji pita da li je i, odnosno, taj prosleđen parametar manji ili jednak 1. Mi smo prosledili 6, tako da taj uslov neće biti ispunjen, pa se neće ni ući u taj if, već se ide na tu sledeću liniju koda. E sad idemo na return... U njemu idu dva rekurzivna poziva ovoj istoj f-ji. Prvi će pozvati f-ju sa prosleđenim argumentom 4 (to je ovo i-2), a drugi sa argumetom 3 (i-3). I sad, za taj prvi poziv- m(4), opet se ulazi u metod m(), i opet ide ista priča: da li je i <= 1, nije, ide se na ovaj donji return, i opet idu dva rekurzivna poziva, sa argumentima 2 i 1 (pošto smo u ovom pozivu prosledili 4 kao argument), itd., itd.
Možda je najbolje da opet slikovito objasnim ceo postupak:
m(6) =
m(4) + 2*m(3) + 1 =
m(2) + 2*m(1) + 2*(m(1) + 2*(m(0)) + 1 =
m(0) + 2*m(-1) + 2*2 + 2*(2 + 2*2) + 1 =
2 + 2*2 + 4 + 2*6 + 1 =
2 + 4 + 4 + 12 + 1 =
23
E aj' sad ti tako probaj da ispišeš taj drugi primer iz tvog post-a. 
[ mikicca @ 15.08.2009. 21:17 ] @
Hvala ti puno, ne ucim napamet,ovo sam sad ukapirala sli uz tvoju pomoc.
[ mikicca @ 16.08.2009. 12:06 ] @
m(4) + 2*m(3) +1 =
m(2) + 2*m(1) + 2*(m(1) + 2*(m(0)) + 1
Samo jos jedno pitanje, ova crvena 1 se prepusuje samo na kraj ne dodaje se svaki put kad racunamo m(4) i m(3),da bude ovako nesto...
m(2) + 2*m(1)+1 + 2*(m(1) + 2*(m(0)+1) + 1 Samo me jos ovo zbunjuje?
[ mikicca @ 16.08.2009. 13:11 ] @
Ja stvarno ne umem da uradim drugi primer :(
[ _Abraxas @ 16.08.2009. 23:36 ] @
Code:
class A {
public int m(int i) {
if (i > 2)
return 2 * m(i - 1) + m(i - 2) + 2;
else
return 0;
}
}
//poziv metode m()
A a = new A();
int i = a.m(5);
m(5)=
2*m(4) + m(3) + 2 =
2*(2*m(3) + m(2) + 2) + 2*m(2) + m(1) + 2 + 2 =
2*(2*(2*m(2)+m(1)+2) + 2*0 +2) + 2*0 + 0 + 2 + 2 =
2*(2*(2*0 + 0 + 2) + 0 + 2) + 0 + 0 + 2 + 2 =
2*(2*2+2) + 4 =
2*6 + 4 =
16
Ovako je mozda komplikovanije zbog zagrada, tako da mozda bi lakse shvatila ukoliko bi radila posebno. Na primer:
m(5) = 2 * m(4) + m(3) + 2,
pa sada vidis sta se desava kada se pozove metoda m sa parametrom i=4,
m(4) = 2*m(3) + 2*m(2) + 2,
pa sada vidimo sta se desava kada parametar i uzme vrednost 3 (za parametar 2 vraca 0)
m(3) = 2*m(2) + m(1) + 2, pa posto su povratne vrednosti od m(2) i m(1) jednake 0, znaci da m(3) vraca rezultat 2, a to implicira da m(4) vraca rezultat 6, a to dalje implicira da m(5) vraca rezultat 16.
Ovde se sadrzi i odgovor na tvoje prethodno pitanje.
[ mikicca @ 17.08.2009. 19:54 ] @
E sad ste me zbunili, dok si ti _Abraxas-e svaki put kada si radio novo m dodavao 2 , Nikola Posa je 1 svaki put izostavio,da li je to neko pravilo ili...? Ja se stvarno trudim i hvala Vam mozda sam malo dosadna, mozda su za Vas to glupa pitanja ali moram da pitam da bih naucila a ko je dobre volje kao Vas dvoje pomocice :), zato ste valjda i tu :).
[ _Abraxas @ 17.08.2009. 23:15 ] @
Citat: Nikola Poša:
Možda je najbolje da opet slikovito objasnim ceo postupak:
m(6) =
m(4) + 2*m(3) + 1 =
m(2) + 2*m(1) + 2*(m(1) + 2*(m(0)) + 1 =
m(0) + 2*m(-1) + 2*2 + 2*(2 + 2*2) + 1 =
2 + 2*2 + 4 + 2*6 + 1 =
2 + 4 + 4 + 12 + 1 =
23
E aj' sad ti tako probaj da ispišeš taj drugi primer iz tvog post-a. :)
Mislim da je Nikola pogresno uradio zadatak. Kao sto je za poziv m(6) dodavao 1, tako treba i u svakom drugom slucaju kada se udje u deo metode gde se funkcija opet rekurzivno poziva. Ukoliko je potrebno da ti uradim zadatak, nije problem (mozda zelis sama da provezbas). Napisi ovde resenje, pa cemo diskutovati.
Inace, da bi bolje shvatila rekurziju, mozda bi trebalo da malo procitas i o LIFO listama (stack). Naravno, ukoliko te ovo interesuje ne samo radi ispita. :D
[Ovu poruku je menjao _Abraxas dana 18.08.2009. u 01:02 GMT+1]
[ mikicca @ 18.08.2009. 18:36 ] @
Pokusala sam da uradim zadatak ali nisam dobijala rezultat kao Nikola, pa sam batalila. Veruj mi zanima me samo radi ispita, ne zelim za Javu ni da cujem. Uradicu zadatak i napisati resenje po mom...pa dajte ocenu.
[ mikicca @ 18.08.2009. 23:38 ] @
m(6)
m(4)+2*m(3)+1
m(2)+2*m(1)+1+2*(m(1)+2*m(0)+1)+1
m(0)+2*m(-1)+1+2*2+1+2(2+2*2+1)+1
2+2*2+6+2*7+1=27
i m se poziva 9 puta
Jel tacno ili ne?
[ _Abraxas @ 19.08.2009. 09:06 ] @
Jeste, tako je. :)
Srecno na ispitu. :D
[ mikicca @ 20.08.2009. 18:44 ] @
extra bas sam srecna sto sam ubola resenje :) definitivno sam dobro ukapirala posto sam ga brzo resila. Hvala Vam obojici na pomoci! I ja se nadam da cu poloziti :D
[ mikicca @ 24.08.2009. 20:01 ] @
Znam da ovo nije rekurzija ali se nadam da nadlezni nece zameriti..tacnije radije bih predlozila da se promeni naziv teme :) pomoc studentima ICT skole da savladaju Javu!
Potrebna su mi objasnjenja za ove zadatke ako ikako mozete da mi pomognete imam ispit iz Jave pa pokusavam da naucim
------------------------------------------------------------------------------------------------------------Posle izvrsavanju koda napisati vrednost promenljivih.
int a=4, b=1;
long c=4;
for(int i=0;i<5;i++;){
If(i>2)a-=++b;
else if (i>=3) c>>=1;
else –c;}
//a=? b=? c=?
------------------------------------------------------------------------------------------------------------
Posle izvrsavanje sledecih naredaba napisati vrednost promenljivih.
int a=2, b=3,c=3,
int x=(--a + ++b)= = ++c ? --a + c++ : --c;
//a=? c=? x=?
Kod ovog zadatka znam da je rec o trojnom operatoru i znam kako se koristi samo me zanima, ako biste mi objasnili detaljnije kako se koriste ++ i -- pre i posle a, b ili c. Malo brkam to kad staru vrednost u racunanju izraza pa da posle uvecam ili smanjim i obrnuto.
Posle izvrsavanju koda napisati vrednost promenljivih.
int a=7;b=1;
long c=3
for(int i=0;i<6++;i++){
switch
{case 1:a-=++b;
Case2: c--;break;
Default:--a;
Case 4:b++;a--;break;
Case 6:a-=3; ++b; break;}}
//a=? b=? c=?
A za ovaj zadatak mi nije jasno gde je nestalo Case 5 tj zasto se ne koristi i sta treba da znaci default tj zasto bas na tom mestu a ne na kraju.
Pomagajte!
[ bigboss @ 25.08.2009. 10:38 ] @
Evo upravo na jednostavan nacin objasnjeno sta je rekurzija
http://tinyurl.com/nrwvu4
[ mikicca @ 25.08.2009. 20:46 ] @
Rekurziju sam ukapirala... hvala u svakom slucaju!
[ gajo2 @ 26.08.2009. 07:14 ] @
Pa ovo su ti zadaci da naucis sta rade operatori. Npr.
c>>=1;
ti pomera bitove promenljive c za jedno mesto na levo. Tako da, ako je c npr. 4, imaces binarno 100, to pomeris na levo i imaces 10, tj. 2. Ne vidim kako "ne zelis za Javu ni da cujes" a mislis da resis ovakve zadatke. Uzmi lepo knjigu ili svesku, procitaj sta radi koji operator pa napisi na papiru sta se desava sa svakom promenljivom u svakoj iteraciji. Da se razumemo, mislim da zadaci nisu trivijalni, i da moras da znas Javu vise od "samo za ispit" da bi znala da ih resis.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|