gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
Simulacija rekurzije, prosirenje primera Faktorijel sa detaljno uradjenom verzijom...
authorDoni Pracner <quinnuendo@gmail.com>
Sat, 30 May 2015 11:01:22 +0000 (13:01 +0200)
committerDoni Pracner <quinnuendo@gmail.com>
Sat, 30 May 2015 11:01:22 +0000 (13:01 +0200)
kodovi/simulacija-rekurzije/Faktorijel.java

index 097f2b5c105ddd9fd0db98775bf106ed29e19efe..f98a72f6a934a33c0e1e1803ec21249aad86c481 100644 (file)
@@ -16,7 +16,10 @@ public class Faktorijel {
        }\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
@@ -38,11 +41,60 @@ public class Faktorijel {
                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
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner