Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Internet > Web razvoj > Klijentske aplikacije

Klijentske aplikacije (X)HTML, CSS, JavaScript, AJAX...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 26.12.2015, 13:00   #1
nighthawk
.
 
Avatar korisnika nighthawk
 
Član od: 2.11.2005.
Poruke: 2.532
Zahvalnice: 113
Zahvaljeno 710 puta na 498 poruka
Određen forumom Javascript - međusobno rekurzivne funkcije

Naišao sam na ovaj primer na internetu i ne mogu baš da shvatim kako radi. Console log u a() funkciji ispisuje 1,6,16 i 36 tokom 4 iteracije, a krajnji rezultat je 42. Dakle, u poslednje izvršenju funkcije a, foo je 36 (linija 5), a na liniji 6 foo dobija i 3*2 iz funkcije b.

Zašto i kako se to dešava? Ja sam očekivao da će kranji rezultat biti 36, tj. da će a() vratiti prvi rezultat veći od 20 bez obzira na sve ostalo.

Kod:
var val = a(1);
console.log("Krajnji rezultat: " + val); // 42

function a(foo){
	console.log(foo); // 1,6,16,36
	if(foo > 20) return foo;
	return b(foo+2);
}

function b(foo){
	return c(foo) + 2;
}

function c(foo){
	return a(foo*2);
}
nighthawk je offline   Odgovor sa citatom ove poruke
Stara 26.12.2015, 14:25   #2
doctor
Deo inventara foruma
 
Član od: 14.3.2008.
Lokacija: EHCPCGG
Poruke: 12.110
Zahvalnice: 4.319
Zahvaljeno 3.295 puta na 2.274 poruka
Određen forumom Re: Javascript - međusobno rekurzivne funkcije

Kod:
Inicijalno se zove a(1) > 42
(a): Zatim se zove b(3) > 42
(b): Zatim c(3) + 2    > 40 + 2 = 42
(c): Zatim a(3*2)      > 40
(a): Zatim b(8)        > 40
(b): Zatim c(8) + 2    > 38 + 2 = 40 
(c): Zatim a(16)       > 38
(a): Zatim b(18)       > 38
(b): Zatim c(18) + 2   > 36 + 2 = 38
(c): Zatim a(36)       > 36
Tu C vraca 36, na njega u B dodaje 2 pa ona vraca 38, pa A vraca 38 i onda C vraca 38, B dodaje 2 to je 40, vraca to u A to je 40 i onda jos jednom C vraca 40, B dodaje 2 i vraca 42, A vraca 42 i to je to
doctor je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku doctor na korisnoj poruci:
nighthawk (26.12.2015)
Stara 26.12.2015, 15:17   #3
Neutrino
Deo inventara foruma
 
Član od: 17.6.2011.
Poruke: 7.336
Zahvalnice: 94
Zahvaljeno 3.334 puta na 2.010 poruka
Određen forumom Re: Javascript - međusobno rekurzivne funkcije

Rekurzivne funkcije su kao seks - koliko puta uđeš toliko puta moraš i da izađeš i uvek nastavljaš tamo gde si poslednji put izašao

Doca je već lepo demonstrirao gde si napravio previd - zaboravio si da rekurzivno pozvane funkcije moraju da izađu iz svojih poziva i da svaki put kad se pozove b() prilikom vraćanja rezultata dodaje još 2. Kada skript dođe do spornog trenutka (val = 36 na liniji #6) if zaista detektuje da je foo veće od 20 i izvršava return foo; ali poenta je u tome što se kontrola izvršenja ne prebacuje na liniju #1 već na poslednju funkciju koja je pozvala a() a to je c() i tako u krug dok se ne izađe iz svih pozvanih rekurzivnih funkcija.


Poslednja ispravka: Neutrino (26.12.2015 u 16:00) Razlog: ..aman hoću li konačno da ubodem format...
Neutrino je offline   Odgovor sa citatom ove poruke
Sledećih 4 korisnika se zahvaljuje korisniku Neutrino na korisnoj poruci:
Game fever (5.1.2016), JeSuis (29.12.2015), nighthawk (26.12.2015), Remedy (26.12.2015)
Stara 26.12.2015, 17:11   #4
Remedy
Veteran
 
Član od: 5.11.2005.
Poruke: 826
Zahvalnice: 177
Zahvaljeno 199 puta na 154 poruka
Određen forumom Re: Javascript - međusobno rekurzivne funkcije

Citat:
Neutrino kaže: Pregled poruke
Rekurzivne funkcije su kao seks - koliko puta uđeš toliko puta moraš i da izađeš i uvek nastavljaš tamo gde si poslednji put izašao
Duhovito i lako se pamti.

Ajd' i ja malo da pametujem. Da bi bilo ociglednije to rekurzivno pozivanje, funkcije "b" i "c" mozemo da izbacimo iz igre. Dakle:
Kod:
function a(foo){
    if (foo > 20) return foo;
    return a((foo + 2) * 2) + 2;
}
Funkcija "a" se poziva 4 puta, prvi put je mi pozivamo (sa 1) i jos 3 puta rekurzivno (sa 6, 16, 36). Kada je pozvana sa 36, "if" uslov je ispunjen, vracamo vrednost, ali gde? U "treci poziv", dakle umesto "a((foo + 2) * 2)" sada imamo 36. Onda se "36 + 2" vraca u "drugi poziv", pa 40 u "prvi poziv" i na kraju on vraca 42 promenljivoj "val". Naravno, u originalu "a" vraca u "c", pa "c" vraca u "b", pa ona u "a", pa jos 2 puta tako u krug, i onda ovo postaje manje vidljivo.
Remedy je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi

Tagovi
javascript

Alatke vezane za temu
Vrste prikaza

Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno


Slične teme
tema temu započeo forum Odgovora Poslednja poruka
Galerija JavaScript Teva Web razvoj 0 24.6.2012 14:57
Funkcije u windows.h biblioeci... ozzytheking Programiranje 7 8.4.2012 21:52
JavaScript. da/ne Game fever Klijentske aplikacije 1 10.10.2011 0:06
Flashplayer i Javascript, pomoć! Lazar95 Aplikativni softver 5 13.1.2009 1:19


Sva vremena su po Griniču +2 h. Sada je 10:51.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com