» »

REKURZIJA

REKURZIJA

fantom333 ::

Pozdravljeni, a mi kdo lahko razloži kako to izračunam peš? 1. Kolikokrat se pokliče metoda r_metoda() med izvajanjem programa Naloga1.java? Kaj izpiše program? _____ / 15 točk
class Naloga1
{
private static int r_metoda(int i)
{
if (i<1)
return 1;
else
return r_metoda(i-1)+r_metoda(i-2);
}
public static void main (String[] args)
{
System.out.println(r_metoda(3));
}
}
. Št. klicev metode: _________________ Program izpiše: _________________ Hvala.

MrStein ::

Na papirju "simuliraš" izvajanje programa. Torej si zapisuješ korake in vrednost spremenljivk.
Malo je zamotano, ker gre vsakič v dve veje, ampak je globina 3, tako da ni tak hudo.
Riši v obliki drevesa, pa bo.
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

fantom333 ::

class Naloga1
{
private static int r_metoda(int i)
{
if (i<1)
return 1;
else
return r_metoda(i-1)+r_metoda(i-2);
}
public static void main (String[] args)
{
System.out.println(r_metoda(3));
}
}


Mislis tako?
                                    r_metoda(3)
             r_metoda(3-1[2])+ r_metoda(3-2[1])

    r_metoda(2-1[1])+ r_metoda(2-2[0])  r_metoda(1-1[0])+ r_metoda(1-2[-1])

r_metoda(1-1[0])+ r_metoda(1-2[-1])



to mi je jasan samo kako dobim rezultat iz te zmešnjave?

celada ::

Poglej kolikokrat se ti izvede funkcija. Ko prideš do konca ( tisti IF pogoj ) ti funkcija vrne rezultat 1. Skupni rezultat je pa pač seštevek

lebdim ::

se pravi, najprej se ti izvede za i:=3. v tem primeru je r_metoda:=r_metoda(2)+r_metoda(1), ker 3 > 1, oz. 3 ni manjše od 1.
potem gledaš za r_metoda(2): ker 2 ni manjše od 1, bo to spet enako: r_metoda:=r_metoda(1)+r_metoda(0)

in seveda ne smeš pozabiti za r_metoda(1): ker 1 ni strogo manjše od 1, je r_metoda:=r_metoda(0)+r_metoda(-1)

sedaj še do konca izračunaš za r_metoda(1): ker sta tako 0 in -1 strogo manjša od 1, je potem r_metoda(1):=1+1=2
sedaj izračunaš še za r_metoda(2)=r_metoda(1)+r_metoda(0) = 2 + 1 = 3

tako dobiš rezultat za r_metoda(3):=r_metoda(2)+r_metoda(1):=3+2=5

tako da dobiš izpisani rezultat 5.

lebdim ::

pozabil sem še število klicev funkcije r_metoda:
- 1 klic je za r_metoda(3)
- 1 klic je za r_metoda(2)
- 1 klic je za r_metoda(1)
- 1 klic je znova za r_metoda(1)
- 1 klic je za r_metoda(0)
- 1 klic je znova za r_metoda(0)
- 1 klic je za r_metoda(-1)

torej, jaz sem dobil 7 klicev funkcije. če sem se pa zmotil, bo pa že kdo drug napisal pravilno rešitev.

Math Freak ::

Jaz sem jih dobil 9.
Rekurzija

fantom333 ::

Hvala vsem zelo ste mi pomagali, zdaj gre....:)

lebdim ::

fantom333, no, in na tak način poteka rekurzija ... za vajo si izpiši še programček z iskanjem členov fibonaccijevega zaporedja 0, 1, 1, 2, 3, 5, 8, 13, ....

potem ti pa tudi svetujem, da si tudi za "nerekurzivne" programčke izpišeš SLED PROGRAMA, da boš preveril pravilnost napisanega algoritma ... vedno si vzemi dovolj majhne vrednosti spremenljivk in potem preveri samo delovanje programa na teh vrednostih ... ane, in če bo rezultat pravilen, je potem tudi program spisan pravilno ...

Zgodovina sprememb…

  • spremenil: lebdim ()

MrStein ::

Ne.
Če je rezultat napačen, je program napačen*
Če je rezultat pravilen, pa je program lahko pravilen, lahko pa je napačen, a slučajno na teh vrednostih, ki si jih probal, vrne pravilen rezultat (na drugih pa ne bo).

* - ali pa si se zmotil v preverjanju
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Java passing

Oddelek: Programiranje
203532 (3185) mihibo5
»

[Android] Kaj metoda vrne?

Oddelek: Programiranje
6906 (744) virusss8
»

C# (strani: 1 2 )

Oddelek: Programiranje
9711909 (8744) Ericssony
»

osnove v Javi - zvezdice

Oddelek: Programiranje
403499 (2721) Tutankhamun
»

read integer v javi

Oddelek: Programiranje
91360 (1261) kopernik

Več podobnih tem