Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.18 KB | None | 0 0
  1. //Andrea Cipriani,
  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. unsigned long int factorial(int n)
  39.  {
  40.     count++;
  41.     if (n<=1)
  42.         return(1);
  43.     else
  44.         n=n*factorial(n-1);
  45.     return(n);
  46. }
  47.  
  48. // Procedure per il cacolo del coefficiente binomiale:
  49.  
  50.  
  51. // Procedura ricorsiva inefficiente:
  52.  
  53.  
  54.  int coefficienteBinomiale1(int n, int k) {
  55.     count++;
  56.      if( k > n )
  57.         return 0;
  58.     if (k==0 || k==n)
  59.         return 1;
  60.     return coefficienteBinomiale1(n-1,k-1)+coefficienteBinomiale1(n-1,k);
  61. }
  62.  
  63. //Soluzione iterativa inefficiente
  64.  
  65.  int coefficienteBinomiale2(int n , int k ){
  66.  
  67.     return (int) ( factorial(n) / ( factorial(k) * factorial(n-k) ) );
  68. }
  69.  
  70. //Soluzione iterativa efficiente ( tempi di calcolo lineari, al variare di k )
  71.  
  72.  
  73. int coefficienteBinomiale3(int n, int k){
  74.    
  75.     int i , risultato = 1;
  76.  
  77.     if ( k > n )
  78.         return coefficienteBinomiale3(k,n);
  79.     if (k == 0 || k == n )
  80.         return 1;
  81.        
  82.     //Calcolo n * (n-1)... *(n-k+1)  /(n-k)! risparmiando  moltiplicazioni
  83.    
  84.     for ( i=0; i < k ; i++){
  85.         count++;
  86.         risultato = risultato * (n - i);
  87.         risultato = risultato / (i + 1);
  88.  
  89.      }
  90.  
  91.     return risultato;
  92.    
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement