File: Stare vježbe/vjezbe07/44__fibonacci__static.c

  1. /*
  2.   44__fibonacci__static.c
  3.   "Ispravak" programa 43__fibonacci.c -- broj_poziva je bitno manji.
  4.   Staticka varijabla (u ovom slucaju polje fib) se "stvara" samo jednom za
  5.   funkciju, a ne jednom za svaki poziv funkcije.
  6.   -----
  7.   Program pomocu rekurzivnih poziva funkcije fibo racuna n-ti Fibonaccijev
  8.   broj. Nakon sto izracunamo neki Fibonaccijev broj spremamo ga u polje fib
  9.   tako da ga necemo vise puta racunati (varijabla fib je staticka!).
  10. */
  11.  
  12. #include <stdio.h>
  13.  
  14. #define MAXN 100
  15.  
  16. int broj_poziva;
  17.  
  18. int fibo ( int n )
  19. {
  20. static int fib[MAXN]={0};
  21.  
  22. broj_poziva++;
  23.  
  24. if (n==0) return 0;
  25. if (n==1) return 1;
  26.  
  27. if (fib[n]==0) fib[n]=fibo(n-1) + fibo(n-2);
  28.  
  29. return fib[n];
  30. }
  31.  
  32.  
  33. int main ()
  34. {
  35. int broj;
  36.  
  37. printf ("Unesite prirodni broj: ");
  38. scanf ("%d", &broj);
  39.  
  40. broj_poziva=0;
  41. printf ("%d. Fibonacci-jev broj je %d.\n", broj, fibo (broj));
  42. printf ("Za njegov izracun funkcija fibo pozvana je %d puta.\n",
  43. broj_poziva);
  44.  
  45. /* jos jednom ponavljamo za neki drugi broj -- uocite koliki je
  46.   sada broj_poziva */
  47.  
  48. printf ("\nUnesite prirodni broj: ");
  49. scanf ("%d", &broj);
  50.  
  51. broj_poziva=0;
  52. printf ("%d. Fibonacci-jev broj je %d.\n", broj, fibo (broj));
  53. printf ("Za njegov izracun funkcija fibo pozvana je %d puta.\n",
  54. broj_poziva);
  55.  
  56. return 0;
  57. }
  58.