Il fattoriale inverso: un esperimento di programmazione

octave

Sapete che cos'è il fattoriale? Sapete come si usa? Probabilmente si. Ciò che c'è davvero di interessante nella conoscenza e che, una volta assimilato un concetto, lo si può trasformare e/o utilizzare come lo si vuole. E una volta fatto, ci si può giocare. Ecco un esperimento divertente nato da una domanda quasi fatta per caso.

Più che come un articolo, potete pensare a questo come una sorta di flusso di coscienza, un racconto di come mi sia venuto in mente di giocare con i numeri. Stavo parlando con il nostro gio22 e mentre parlavamo mi è stata fatta una domanda: "sapresti scrivere un programma che calcoli il fattoriale inverso?"

Dunque il fattoriale è un operatore matematico che moltiplica un numero per ciascuno dei numeri che lo precedono fino all'unità. I suoi utilizzi sono molteplici e sicuramente il nostro matematico di punta, Marco Giancola, potrà illuminarvi a dovere in merito.

Per fare un esercizio di programmazione di questo tipo, però, bisogna chiarirsi bene le idee: se è fattoriale è facile da calcolare perché tutti sanno che da un certo numero in giù tutti i numeri sono definiti, non si può calcolare il fattoriale inverso di un numero che non si conosce.

Se, infatti, l'operazione di fattoriale è certamente invertibile, bisogna per forza definire un massimo, dal momento che i numeri sono infiniti, altrimenti il risultato non potrebbe che essere infinito. E dal momento che i prodotti devono essere fatti in questa maniera, il numero diventerebbe infinito molto velocemente rispetto a quanto non accadrebbe semplicemente contandoli.

Detto questo, bando alle ciance: ecco la routine implementata in cui viene calcolata l'operazione richiesta:

function [i]=inv_fact(n)

%% La funzione calcola il fattoriale inverso, partendo dal numero in
%% ingresso
i=1;
numero=n;
m=0; % flag di controllo
while(n>1)
    n=n/i;
    if(round(n)~=n)
        disp('Il numero inserito non risulta da un fattoriale!');
        m=1;
        break;
    else
        i=i+1;
    end
end
if (m==0)
    i=i-1;
    s=horzcat(num2str(numero),' e'' il fattoriale di ', num2str(i));
    disp(s);
else
end

onde evitare di fomentare qualsiasi forma di polemica per il fatto che il codice che ho utilizzato è stato scritto in MATLAB, questa volta mi sono messo d'impegno a dare uno sguardo a Scilab ed Octave, con buona pace di chi era rimasto molto offeso le altre volte perché non ne abbiamo parlato.

In Octave, il codice è esattamente lo stesso. Le funzioni sono tutte presenti e l'output è quello che ci aspettiamo:

24 e' il fattoriale di 4

In Scilab, invece, la cosa è un po' più complessa perchè num2str è una funziona la cui analoga è msprintf (quindi c'è un po' da lavorare sul codice). Tra l'altro questa funzione viene particolareggiata se ci sono esigenze tipo precisione e formato. num2str(a,precision) è la sintassi per avere una data precisione; sfortunatamente, però, in questo particolare caso, Scilab non propone analogie o sostitute. Se vogliamo un dato formato, invece, num2str(a,format) diventa msprintf(format,a).

Detto questo, il codice è abbastanza semplice, le operazioni sono banali ma se avete bisogno di qualunque tipo di spiegazione, sappiate che sono a disposizione nei commenti per parlarne.

Che cosa vuol dire questo articolo? Di che cosa parla in effetti? Queste sono domande molto giuste.

Scrivo per darvi un'idea: programmare significa fare o far fare, meglio, delle cose. Se uno sa che cosa deve ottenere, per quanto idealmente sembri assurdo o inutile, la programmazione ci dà la possibilità di farlo.

Una volta che l'abbiamo fatto? Adesso che abbiamo realizzato il fattoriale inverso, che ce ne facciamo?

È la stessa domanda che potreste farvi dopo aver studiato un trattato di filosofia ma la risposta non può che essere la stessa: sapete una cosa di più, vi siete esercitati, vi siete allenati, avete provato e avete ottenuto risultati.

Cosa c'è di meglio che tenersi sempre in allenamento e con la mente sveglia?

STAMPA     Tags:, , ,

12 Comments

  1. Mariangela.Mone 25 agosto 2014
  2. Marcello.Colozzo 1 29 agosto 2014
  3. Marcello.Colozzo 1 30 agosto 2014
  4. Piero Boccadoro Piero Boccadoro 31 agosto 2014
  5. Piero Boccadoro Piero Boccadoro 31 agosto 2014
  6. Marcello.Colozzo 1 1 settembre 2014
  7. Piero Boccadoro Piero Boccadoro 1 settembre 2014
  8. Marcello.Colozzo 1 1 settembre 2014
  9. GianlucaAngelone Gianluca Angelone 4 settembre 2014
  10. Piero Boccadoro Piero Boccadoro 5 settembre 2014
  11. Boris L. 8 settembre 2014
  12. salvatore.pizza 9 settembre 2014

Leave a Reply