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