Primi passi con F# - l'esempio della funzione Totiente
Oggi abbiamo voluto esplorare brevemente il linguaggio di programmazione F# (documentazione) perfettamente supportato da visual studio.
Per imparare ad utilizzarlo abbiamo pensato di implementare nuovamente la funzione totiente di Eulero. L'algoritmo è leggermente differente ma fa utilizzo delle prime e più semplici "caratteristiche funzionali" di F#.
Essenzialmente definiamo la funzione Phi che per numeri maggiori di 3 esegue un ciclo che ci permette di contare i numeri coprimi con l'argomento.
Successivamente definiamo una lista contenente i numeri da 1 a 20 e poi utlizzando una lambda expression calcoliamo la funzione Phi su tutti gli elementi della lista.
1 2 3 4 5 6 7 8 9 10 |
let Phi x = if(x<3) then 1 else let mutable phix = 2 for i in 2..(x-2) do if(x % i <> 0) then phix <- phix + 1 phix let test = [1..20] let risu = List.map(fun x -> Phi x)(test) |
Vogliamo ora migliorare leggermente il codice, ovvero sfruttare meglio e di più le potenzialità di F#.
La mancanza più evidente dal punto di vista funzionale è la presenza del ciclo for. Abbiamo usato il metodo map di List, cercheremo ora di usare il metodo filter. Nel codice seguente per ogni numero x costruiamo una lista che filtreremo lasciando solo i numero coprimi con x. La lunghezza di questa lista è il valore della funzione phi (abbiamo aggiustato i valori di 2 perché sappiamo sempre che 1 e x-1 vanno contati). Ecco il codice aggiornato
1 2 3 4 5 6 7 |
let Phi x = if(x<3) then 1 else (List.filter(fun i -> x % i <> 0)([2..(x-2)])).Length+2 let test = [1..20] let risu = List.map(fun x -> Phi x)(test) |
Le prestazioni non sono comparabili con quelle dell'algoritmo per C# ma a nostro avviso è comunque un esempio istruttivo!
Per iniziare a giocare con F# vi consigliamo di visitare http://www.tryfsharp.org/
comments powered by Disqus