gitweb on Svarog
projekti pod git sistemom za održavanje verzija -- projects under the git version control system
summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 7a9c632)
raw | patch | inline | side by side (parent: 7a9c632)
author | Doni Pracner <quinnuendo@gmail.com> | |
Sat, 30 May 2015 11:01:22 +0000 (13:01 +0200) | ||
committer | Doni Pracner <quinnuendo@gmail.com> | |
Sat, 30 May 2015 11:01:22 +0000 (13:01 +0200) |
kodovi/simulacija-rekurzije/Faktorijel.java | patch | blob | history |
diff --git a/kodovi/simulacija-rekurzije/Faktorijel.java b/kodovi/simulacija-rekurzije/Faktorijel.java
index 097f2b5c105ddd9fd0db98775bf106ed29e19efe..f98a72f6a934a33c0e1e1803ec21249aad86c481 100644 (file)
}\r
\r
/**\r
- * Simulirana verzija rekurzivne funkcije\r
+ * Simulirana verzija rekurzivne funkcije, u kojoj se samo posmatra\r
+ * rekurzivni spust i povratak, posto u ovoj jednostavnoj funkciji i ne\r
+ * postoji nista drugo. Takodje se na steku samo cuva vrednost parametra\r
+ * 'n', nije pravljen infotip jer nema potrebe.\r
*/\r
static int faktorijelS(int n) {\r
Stek<Integer> s = new Stek<Integer>(100);\r
return rez;\r
}\r
\r
+ // eksplicitni infotip koji se uklapa u algoritam pretvaranja funkcije\r
+ static private class InfoTip {\r
+ int n;\r
+ int adr; // nema potrebe kad ima samo jedan poziv\r
+ }\r
+\r
+ /**\r
+ * Simulirana verzija rekurzivne funkcije, sa svim detaljima datog algoritma\r
+ * za transformaciju. Mnogi detalji su nepotrebni za ovu funkciju, sto je i\r
+ * oznaceno, medjutim nije greska navesti ih \r
+ */\r
+ static int faktorijelSDetaljno(int n) {\r
+ Stek<InfoTip> s = new Stek<>(100);\r
+ int rez;\r
+ InfoTip el;\r
+\r
+ do {\r
+ // rekurzivni pozivi do trivijalnog slučaja\r
+ while (n > 1) {\r
+ el = new InfoTip();\r
+ el.n = n;\r
+ el.adr = 1;// drugo ni ne postoji\r
+ s.stavi(el);\r
+ n--;\r
+ }\r
+\r
+ // trivijalni slučaj\r
+ rez = 1;\r
+\r
+ // povratak iz rekurzije\r
+ boolean nemaPoziva = true;\r
+ while (!s.jePrazan() && nemaPoziva) {\r
+ el = s.skiniVrh();\r
+ n = el.n;\r
+ if (el.adr == 1) {\r
+ rez = rez * n;\r
+ } // ne postoje druge adrese\r
+ }\r
+\r
+ // posto se 'nemaPoziva' ne menja\r
+ // u ovom momentu ce s uvek biti prazan\r
+ // pa nema potrebe ni za ovom petljom\r
+ } while (!s.jePrazan());\r
+\r
+ return rez;\r
+ }\r
+\r
public static void main(String[] args) {\r
int n = Svetovid.in.readInt("n = ?");\r
System.out.print("n! = ");\r
System.out.print(faktorijelR(n));\r
System.out.print(" = ");\r
- System.out.println(faktorijelS(n));\r
+ System.out.print(faktorijelS(n));\r
+ System.out.print(" = ");\r
+ System.out.println(faktorijelSDetaljno(n));\r
}\r
}
\ No newline at end of file