From 06b67cca15377341d248c55dccff07d2738f60c6 Mon Sep 17 00:00:00 2001 From: Doni Pracner Date: Sat, 30 May 2015 13:01:22 +0200 Subject: [PATCH] Simulacija rekurzije, prosirenje primera Faktorijel sa detaljno uradjenom verzijom simulacije --- kodovi/simulacija-rekurzije/Faktorijel.java | 56 ++++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/kodovi/simulacija-rekurzije/Faktorijel.java b/kodovi/simulacija-rekurzije/Faktorijel.java index 097f2b5..f98a72f 100644 --- a/kodovi/simulacija-rekurzije/Faktorijel.java +++ b/kodovi/simulacija-rekurzije/Faktorijel.java @@ -16,7 +16,10 @@ public class Faktorijel { } /** - * Simulirana verzija rekurzivne funkcije + * Simulirana verzija rekurzivne funkcije, u kojoj se samo posmatra + * rekurzivni spust i povratak, posto u ovoj jednostavnoj funkciji i ne + * postoji nista drugo. Takodje se na steku samo cuva vrednost parametra + * 'n', nije pravljen infotip jer nema potrebe. */ static int faktorijelS(int n) { Stek s = new Stek(100); @@ -38,11 +41,60 @@ public class Faktorijel { return rez; } + // eksplicitni infotip koji se uklapa u algoritam pretvaranja funkcije + static private class InfoTip { + int n; + int adr; // nema potrebe kad ima samo jedan poziv + } + + /** + * Simulirana verzija rekurzivne funkcije, sa svim detaljima datog algoritma + * za transformaciju. Mnogi detalji su nepotrebni za ovu funkciju, sto je i + * oznaceno, medjutim nije greska navesti ih + */ + static int faktorijelSDetaljno(int n) { + Stek s = new Stek<>(100); + int rez; + InfoTip el; + + do { + // rekurzivni pozivi do trivijalnog slučaja + while (n > 1) { + el = new InfoTip(); + el.n = n; + el.adr = 1;// drugo ni ne postoji + s.stavi(el); + n--; + } + + // trivijalni slučaj + rez = 1; + + // povratak iz rekurzije + boolean nemaPoziva = true; + while (!s.jePrazan() && nemaPoziva) { + el = s.skiniVrh(); + n = el.n; + if (el.adr == 1) { + rez = rez * n; + } // ne postoje druge adrese + } + + // posto se 'nemaPoziva' ne menja + // u ovom momentu ce s uvek biti prazan + // pa nema potrebe ni za ovom petljom + } while (!s.jePrazan()); + + return rez; + } + public static void main(String[] args) { int n = Svetovid.in.readInt("n = ?"); System.out.print("n! = "); System.out.print(faktorijelR(n)); System.out.print(" = "); - System.out.println(faktorijelS(n)); + System.out.print(faktorijelS(n)); + System.out.print(" = "); + System.out.println(faktorijelSDetaljno(n)); } } \ No newline at end of file -- 2.17.1