Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.14 KB | None | 0 0
  1. //Andrea Cipriani, esercizio per il corso di teoria dei grafi a.a 2010/2011
  2.  
  3. #include <stdio.h>
  4.  
  5. int count = 0; // Variabile globale per il conto di chiamate a procedure date dalla ricorsività
  6.  
  7. int main(void){
  8.     unsigned int n,k,scelta,risultato;
  9.     printf("Calcolo del coefficiente binomiale, \n");
  10.     printf("Inserire primo parametro n\n");
  11.     scanf("%d",&n);
  12.     printf("n = %d\n",n);
  13.     printf("Inserire secondo parametro k\n");
  14.     scanf("%d",&k);
  15.     printf("k = %d\n",k);
  16.     printf("Scegliere il modo in cui calcolare il coefficiente binomiale\n");
  17.     printf("1 - Procedura ricorsiva inefficiente -\n");
  18.     printf("2 - Procedura iterativa inefficiente -\n");
  19.     printf("3 - Procedura iterativa efficiente -\n");
  20.     scanf("%d",&scelta);
  21.     switch(scelta){
  22.         case 1:
  23.             risultato = coefficienteBinomiale1(n,k);
  24.             break;
  25.         case 2:
  26.             risultato = coefficienteBinomiale2(n,k);
  27.             printf("Attenzione ai probabili overflow nei calcoli dei fattoriali\n");
  28.             break;
  29.         case 3:
  30.             risultato = coefficienteBinomiale3(n,k);
  31.             break;
  32.     }
  33.     printf("%d binomiale %d = %d , chiamate a procedura = %d\n",n,k,risultato,count);
  34.     return 0;
  35. }
  36.  
  37. // Procedura per il calcolo ricorsivo del fattoriale di un intero n
  38.  
  39. unsigned long int factorial(int n)
  40.  {
  41.     count++;
  42.     if (n<=1)
  43.         return(1);
  44.     else
  45.         n=n*factorial(n-1);
  46.     return(n);
  47. }
  48.  
  49. // Procedura ricorsiva inefficiente:
  50.  
  51.  int coefficienteBinomiale1(int n, int k) {
  52.     count++;
  53.      if( k > n )
  54.         return 0;
  55.     if (k==0 || k==n)
  56.         return 1;
  57.     return coefficienteBinomiale1(n-1,k-1)+coefficienteBinomiale1(n-1,k);
  58. }
  59.  
  60. //Soluzione iterativa inefficiente
  61.  
  62.  int coefficienteBinomiale2(int n , int k ){
  63.  
  64.     return (int) ( factorial(n) / ( factorial(k) * factorial(n-k) ) );
  65. }
  66.  
  67. //Soluzione iterativa efficiente ( tempi di calcolo lineari, al variare di k )
  68.  
  69. int coefficienteBinomiale3(int n, int k){
  70.    
  71.     int i , risultato = 1;
  72.  
  73.     if ( k > n )
  74.         return 0;
  75.     if (k == 0 || k == n )
  76.         return 1;
  77.        
  78.     //Calcolo n * (n-1)... *(n-k+1)  /(n-k)! risparmiando  moltiplicazioni
  79.    
  80.     for ( i=0; i < k ; i++){
  81.         count++;
  82.         risultato = risultato * (n - i);
  83.     risultato = risultato / (i + 1);
  84.      }
  85.  
  86.     return risultato;
  87.    
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement