Esercizi di Calcolo Combinatorio

Il calcolo combinatorio si sposa molto bene con la programmazione, chi meglio di un calcolatore, infatti, può aiutarci a fare dei calcoli anche molto complessi sulle probabilità? In questo articolo verrà spiegato il modo di risolvere alcuni esercizi di calcolo combinatorio, quello che interessa è vedere come si può fare il tutto in un linguaggio di programmazione informatica, nel quel caso sarà il C#. Ho scelto il C# perché semplice e soprattutto vicino sia al C/C++ sia a Java, ma le stesse procedure possono essere adattate facilmente a qualsiasi altro linguaggio di sviluppo.
Per prima cosa dobbiamo creare una classe che ho chiamato “CalcComb” nella quale il costruttore accetta due argomenti numerici, il numero di elementi ed il numero dei gruppi, il classico (n, k ) del calcolo combinatorio. La prima funzione della classe dovrà necessariamente essere quella del calcolo del fattoriale di un numero, che poi equivale alle permutazioni semplici di quel numero di oggetti. Ecco il codice sorgente della classe:

class CalcComb
{
   int m_n = 0;
   int m_k = 0;

   public CalcComb(int n, int k)
   {
      if (n > 20) n = 20;
      if (k > 20) k = 20;

      m_n = n;
      m_k = k;
    }

    public long Fattoriale(bool bN = true)
    {
      long r = 1;
      int j = bN ? m_n : m_k;

      for (int i = j; i > 0; i--)
         r *= i;

      return r;
     }
   }

   class Program
   {
      static void Main(string[] args)
      {
        CalcComb c = new CalcComb(5, 3);

        System.Console.WriteLine("Le permutazioni semplici di n
             sono: " + c.Fattoriale());
        System.Console.WriteLine("Le permutazioni semplici di k
             sono: " + c.Fattoriale(false) + "\n");

        System.Console.ReadLine();
      }
   }

Una volta inseriti i valori iniziali nel costruttore della classe ho creato una funzione per il calcolo del fattoriale del valore n o del valore k, tutto dipende dall’argomento della funzione di tipo booleano. Nella funzione “main” ho poi creato un esempio con la stampa dei valori dei due fattoriali, al termine ho richiesto un valore da input per fermare il flusso del programma, utile per l’esecuzione dello stesso senza debug all’interno dell’ambiente di sviluppo.
Per calcolare altri valori come le disposizioni o le combinazioni occorre modificare anche la funzione per il calcolo del fattoriale di un numero rendendola più generica e non soltanto specifica per gli attributi membri della classe.

class CalcComb
{
   int m_n = 0;
   int m_k = 0;

   public CalcComb(int n, int k)
   {
      if (n > 20) n = 20;
      if (k > 20) k = 20;

      m_n = n;
      m_k = k;
   }

   public long Fattoriale(int n)
   {
       long r = 1;

       if (n > 20)
          n = 20;

       for (int i = n; i > 0; i--)
          r *= i;

       return r;
    }

    public long Disposizioni(bool bRepeat = false)
    {
       if (!bRepeat)
       {
          long ftn = Fattoriale(m_n);
          long ftk = Fattoriale(m_n - m_k);

          return ftn / ftk;
       }

       return (long)Math.Pow(m_n, m_k);
    }

    public long Combinazioni()
    {
       long ftn = Fattoriale(m_n);
       long fth = Fattoriale(m_k);
       long ftk = Fattoriale(m_n - m_k);

       return ftn / (fth * ftk);
    }
 }

 class Program
 {
    static void Main(string[] args)
    {
        CalcComb c = new CalcComb(5, 3);

        System.Console.WriteLine("Le permutazioni semplici (5):
             " + c.Fattoriale(5));
        System.Console.WriteLine("Le disposizioni semplici (5,3):
             " + c.Disposizioni());
        Syste.Console.WriteLine("Le disposizioni con ripet. (5,3)
             " + c.Disposizioni(true));
        System.Console.WriteLine("Le combinazioni semplici (5,3):
             " + c.Combinazioni());

        System.Console.ReadLine();
     }
  }

Il codice riportato è solo a titolo di esempio, serve soltanto per mostrare come è possibile implementare facilmente degli algoritmi semplici per la risoluzione di esercizi relativi al calcolo combinatorio.

Informazioni su Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.
Questa voce è stata pubblicata in C# (sharp), Programmazione. Contrassegna il permalink.