Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.55 KB | None | 0 0
  1.  
  2. class Stack
  3. {
  4. Object[] elements;
  5. int top;
  6.  
  7. public Stack(int size)
  8. {
  9. elements = new Object[size];
  10. top = -1;
  11. }
  12.  
  13. public boolean isEmpty()
  14. {
  15. return top == -1;
  16. }
  17.  
  18. public boolean isFull()
  19. {
  20. return top == elements.length-1;
  21. }
  22.  
  23. public Object top()
  24. {
  25. if (isEmpty()) // error: throw new UnderflowException
  26. return null;
  27. else
  28. return elements[top] ;
  29. }
  30.  
  31. public void push(Object e)
  32. {
  33. if (isFull()) //error: throw new OverflowException
  34. ;
  35. else
  36. {
  37. top++;
  38. elements[top] = e;
  39. }
  40. }
  41.  
  42. public void pop()
  43. {
  44. if (isEmpty()) // error: throw new UnderflowException
  45. ;
  46. else top--;
  47. }
  48. }
  49.  
  50.  
  51.  
  52. public class recToIter {
  53.  
  54. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  55. //
  56. // NALOGA 1:
  57. //
  58. // Podana je (naivna) rekurzivna funkcija za izracun n-tega Fibonaccijevega stevila.
  59. //
  60. // Spremeni podano rekurzivno funkcijo v iterativno z uporabo sklada.
  61. //
  62. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  63.  
  64. public static int fibRek(int n) {
  65. if (n <= 2)
  66. return 1;
  67. else
  68. return fibRek(n-1) + fibRek(n-2);
  69. }
  70.  
  71. // public static int fibRek(int n) {
  72. // if (n <= 2)
  73. // return 1;
  74. // else {
  75. // int tmp1 = fibRek(n-1);
  76. // int tmp2 = fibRek(n-2);
  77. // return tmp1 + tmp2;
  78. // }
  79. // }
  80.  
  81.  
  82. public static int fibIterStack(int n)
  83. {
  84. class StackElement
  85. {
  86. int n;
  87. int temp1;
  88. int temp2;
  89. int address;
  90.  
  91. public StackElement() {}
  92. public StackElement(StackElement e)
  93. {
  94. n = e.n;
  95. temp1 = e.temp1;
  96. temp2 = e.temp2;
  97. address = e.address;
  98. }
  99. }
  100.  
  101. Stack s = new Stack(100); //100 ugnzdenih klicev se pozre
  102. StackElement e = new StackElement();
  103. e.n = n;
  104. e.address = 0;
  105. s.push(e);
  106. int result = 0; //ker je nasa funkcija int torej more neke vracat
  107.  
  108. //simulacija izvedbe
  109. do
  110. {
  111. e = (StackElement) s.top(); //morem castat, ker ti vrne sam objekt, ker je splosna implementacija za sklad
  112. s.pop();
  113. switch (e.address)
  114. {
  115. case 0:
  116. if(e.n <= 2)
  117. {
  118. result = 1;
  119. break;
  120. }
  121. else
  122. {
  123. //rabimo zapis kam bomo skocli v globino in kam pol nazaj
  124. //prvo damo mesto povratka pol pa skoka notr v sklad, ker first in last out
  125. e.address = 1; //dam na sklad
  126. s.push(new StackElement(e)); //ne bom dala e, ker hocem v skladu neodvisen zapis, da ceprov tle spreminjam e, se v skladu ne spreminja, zato kopijo nrdim
  127. e.n--;
  128. e.address = 0; //zj to dam na sklad
  129. s.push(new StackElement(e));
  130. break;
  131. }
  132.  
  133. case 1:
  134. //zdej smo prsli vn iz rekurzije in morem v temp shrant rez
  135. e.temp1 = result;
  136. //zdej morem v durgo rekurijo it
  137. e.address = 2;
  138. s.push(new StackElement(e));
  139. e.n -= 2;
  140. e.address = 0;
  141. s.push(new StackElement(e));
  142. break;
  143.  
  144. case 2:
  145. //prsli iz druge rekurzije
  146. e.temp2 = result;
  147. result = e.temp1 + e.temp2;
  148. break;
  149. }
  150. } while (!s.isEmpty());
  151.  
  152. return result;
  153. }
  154.  
  155.  
  156. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  157. //
  158. // NALOGA 2:
  159. //
  160. // Celi del logaritma nekega stevila se racuna tako, da se presteje, kolikokrat je treba stevilo (celostevilcno) deliti
  161. // z osnovo logaritma, da stevilo postane manjse od osnove.
  162. //
  163. // a) Sestavi iterativno funkcijo za racunanje celega dela logaritma danega stevila n pri osnovi b.
  164. //
  165. // b) Sestavi rekurzivno funkcijo za racunanje celega dela logaritma danega stevila n pri osnovi b.
  166. //
  167. // c) Spremeni rekurzivno verzijo iz naloge b) v iterativno z uporabo sklada.
  168. //
  169. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  170.  
  171. public static int celiDelLogIter(double n, double b)
  172. {
  173. // Dopolnite kodo
  174.  
  175. return 0;
  176. }
  177.  
  178. public static int celiDelLogRek(double n, double b)
  179. {
  180. // Dopolnite kodo
  181.  
  182. return 0;
  183. }
  184.  
  185. public static int celiDelLogIterStack(double n, double b)
  186. {
  187. // Dopolnite kodo
  188.  
  189. return 0;
  190. }
  191.  
  192.  
  193. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  194. //
  195. // NALOGA 3:
  196. //
  197. // Spremeni rekurzivno funkcijo "nadaljujIzrazRek" v iterativno z uporabo sklada.
  198. //
  199. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  200.  
  201. public static void nadaljujIzrazRek(int ukl, int zak, char[] izraz, int n) {
  202. if (zak == 0) {
  203. System.out.println(izraz);
  204. return;
  205. }
  206.  
  207. if (ukl > 0) {
  208. izraz[n] = '(';
  209. nadaljujIzrazRek(ukl-1, zak, izraz, n+1);
  210. }
  211.  
  212. if (zak > ukl) {
  213. izraz[n] = ')';
  214. nadaljujIzrazRek(ukl, zak-1, izraz, n+1);
  215. }
  216. }
  217.  
  218. public static void nadaljujIzrazIterStack(int ukl, int zak, char[] izraz, int n)
  219. {
  220. // Dopolnite kodo
  221.  
  222. }
  223.  
  224.  
  225.  
  226. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  227. //
  228. // NALOGA 4:
  229. //
  230. // Spremeni rekurzivno funkcijo "sestaviRek" v iterativno z uporabo sklada.
  231. //
  232. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  233.  
  234. public static boolean sestaviRek(int[] vrednosti, int index, int znesek) {
  235. if (znesek == 0)
  236. return true;
  237.  
  238. if (znesek < 0)
  239. return false;
  240.  
  241. if (index >= vrednosti.length)
  242. return false;
  243.  
  244. if (sestaviRek(vrednosti, index+1, znesek - vrednosti[index])) {
  245. System.out.print(vrednosti[index] + ", ");
  246. return true;
  247. }
  248. else
  249. return sestaviRek(vrednosti, index+1, znesek);
  250. }
  251.  
  252. public static boolean sestaviIterStack(int[] vrednosti, int index, int znesek)
  253. {
  254. // Dopolnite kodo
  255.  
  256. return false;
  257. }
  258.  
  259.  
  260.  
  261. public static void main(String[] args)
  262. {
  263. System.out.println("NALOGA 1\n");
  264. System.out.println("Rekurzivna verzija: osmo Fibonaccievo stevilo je " + fibRek(8));
  265. System.out.println("Iteracija s skladom: osmo Fibonaccievo stevilo je " + fibIterStack(8));
  266.  
  267.  
  268. double n = 12.876;
  269. double b = 1.587;
  270.  
  271. System.out.println("\n\n\nNALOGA 2\n");
  272. System.out.println("Iterativna verzija: celi del logaritma stevila " + n + " pri osnovi " + b + " je " + celiDelLogRek(n,b));
  273. System.out.println("Rekurzivna verzija: celi del logaritma stevila " + n + " pri osnovi " + b + " je " + celiDelLogIter(n,b));
  274. System.out.println("Iteracija s skladom: celi del logaritma stevila " + n + " pri osnovi " + b + " je " + celiDelLogIterStack(n,b));
  275.  
  276.  
  277. System.out.println("\n\n\nNALOGA 3\n");
  278. char[] izraz = new char[6];
  279.  
  280. System.out.println("Rekurzivna verzija:");
  281. nadaljujIzrazRek(3, 3, izraz, 0);
  282. System.out.println("\nIteracija s skladom:");
  283. nadaljujIzrazIterStack(3, 3, izraz, 0);
  284.  
  285. System.out.println("\n\n\nNALOGA 4\n");
  286. int[] vrednosti = {8,5,1,3,4};
  287. int znesek = 10;
  288.  
  289. System.out.println("Rekurzivna verzija:");
  290. System.out.print("Znesek " + znesek + " dobimo tako, da sestejemo elemente: ");
  291.  
  292. if (!sestaviRek(vrednosti, 0, znesek))
  293. System.out.println("Zneska ni mogoce sestaviti s podanimi elementi");
  294. else
  295. System.out.println();
  296.  
  297. System.out.println("\nIteracija s skladom:");
  298. System.out.print("Znesek " + znesek + " dobimo tako, da sestejemo elemente: ");
  299.  
  300. if (!sestaviIterStack(vrednosti, 0, znesek))
  301. System.out.println("Zneska ni mogoce sestaviti s podanimi elementi");
  302. else
  303. System.out.println();
  304. }
  305.  
  306. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement