gitweb on Svarog
projekti pod git sistemom za održavanje verzija -- projects under the git version control systemdiff --git a/kodovi/simulacija-rekurzije/Rek2.java b/kodovi/simulacija-rekurzije/Rek2.java
--- /dev/null
@@ -0,0 +1,106 @@
+/**\r
+ * Kompleksniji primer u kome simuliramo funkciju cije funkcionisanje\r
+ * i rezultat nisu nuzno jasni.\r
+ * \r
+ * U funkciji postoje ugnjezdjeni pozivi na koje treba obratiti paznju.\r
+ * \r
+ * Ova verzija resenja takodje sadrzi i ispise parametara na 'ulazu' u\r
+ * funkciju, i iste takve kod simulirane verzije da se jasno vidi da se\r
+ * svi pozivi desavaju u istom redosledu, pri cemu su dodatno naznacene\r
+ * adrese poziva u simuliranoj verziji. Ovakav dodatak nije potreban inace\r
+ * za resavanje, ali moze pomoci u razumevanju i proveri da li je\r
+ * sve ispravno uradjeno.\r
+ */\r
+public class Rek2 {\r
+\r
+ static int g(int x, int y, int n) {\r
+ System.out.printf("0 %d %d %d\n",x,y,n);\r
+ if (n < 3) {\r
+ return x + y;\r
+ }\r
+\r
+ if (n % 2 == 1) {\r
+ return g(g(x + 1, y, n - 2), y, n - 3);\r
+ } else {\r
+ return g(x, g(x, y + 1, n - 2), n - 3);\r
+ }\r
+ }\r
+\r
+ private static class InfoTip {\r
+ int x, y, n, adr;\r
+ }\r
+\r
+ static int gS(int x, int y, int n) {\r
+ int rez;\r
+ InfoTip el;\r
+ Stek<InfoTip> s = new Stek<InfoTip>();\r
+ System.out.printf("%d %d %d %d\n",0,x,y,n);\r
+\r
+ do {\r
+ // rekurzivni spust\r
+ while (n >= 3) {\r
+ if (n % 2 == 1) {\r
+ el = new InfoTip();\r
+ el.x = x;\r
+ el.y = y;\r
+ el.n = n;\r
+ el.adr = 1;\r
+ s.stavi(el);\r
+ x = x + 1;\r
+ n = n - 2;\r
+ System.out.printf("%d %d %d %d\n",el.adr,x,y,n);\r
+ } else {\r
+ el = new InfoTip();\r
+ el.x = x;\r
+ el.y = y;\r
+ el.n = n;\r
+ el.adr = 3;\r
+ s.stavi(el);\r
+ y = y + 1;\r
+ n = n - 2;\r
+ System.out.printf("%d %d %d %d\n",el.adr,x,y,n);\r
+ }\r
+ }\r
+\r
+ // trivijalni slucaj\r
+ rez = x + y;\r
+\r
+ // povratak iz rekurzije\r
+ boolean nemaPoziva = true;\r
+ while (!s.jePrazan() && nemaPoziva) {\r
+ el = s.skiniVrh();\r
+ x = el.x;\r
+ y = el.y;\r
+ n = el.n;\r
+ if (el.adr == 1) {\r
+ el.x = x; // nije potrebno zapravo\r
+ el.y = y; // nije potrebno zapravo\r
+ el.n = n; // nije potrebno zapravo\r
+ el.adr = 2;\r
+ s.stavi(el);\r
+ x = rez;\r
+ n = n - 3;\r
+ System.out.printf("%d %d %d %d\n",el.adr,x,y,n);\r
+ nemaPoziva = false;\r
+ } else if (el.adr == 3) {\r
+ el.x = x; // nije potrebno zapravo\r
+ el.y = y; // nije potrebno zapravo\r
+ el.n = n; // nije potrebno zapravo\r
+ el.adr = 4;\r
+ s.stavi(el);\r
+ y = rez;\r
+ n = n - 3;\r
+ System.out.printf("%d %d %d %d\n",el.adr,x,y,n);\r
+ nemaPoziva = false;\r
+ } // adr 2 i 4\r
+ // rez = rez; nema smisla pisati\r
+ }\r
+ } while (!s.jePrazan());\r
+ return rez;\r
+ }\r
+\r
+ public static void main(String[] args) {\r
+ System.out.println(g(2, 3, 11));\r
+ System.out.println(gS(2, 3, 11));\r
+ }\r
+}\r