Oggi costruiamo una classe che permette di produrre tutti i numeri di fibonacci (più piccoli di Int32.MaxValue). Per farlo implementiamo l'interfaccia IEnumerable<int> e quindi per ottenere i numeri in successione dovremo eseguire una foreach su una istanza della classe.

L'implementazione non comporta particolari difficoltà, l'unica attenzione va fatta alla necessità di restituire i fibonacci fino a Int32.MaxValue. Ovviamente qualunque intero è più piccolo di Int32.MaxValue e sommando due interi che insieme superano Int32.MaxValue, non si ottiene nessun tipo di eccezione. Quindi testare in questo modo non funziona
 
if(n+m<Int32.MaxValue)
    // fai qualcosa

Le strade, a nostro avviso, sono due:

- mettere tutto il codice in un blocco "checked" e quindi ottenere una eccezione di tipo overflow se superiamo Int32.MaxValue
- utilizzare delle variabili long in modo che la disuguaglianza n+m<Int32.MaxValue abbia senso.

Noi abbiamo scelto di utilizzare la seconda e castare a int i valori prima di restituirli. Detto questo l'implementazione è molto semplice e la riportiamo qua sotto

class FibonacciEnumerable : IEnumerable<int>
{
    public IEnumerator<int> GetEnumerator()
    {
        long n = 1;
        long n1 = 1;
        long Fib = 2;

        yield return 1;
        yield return 1;

        while (Fib < Int32.MaxValue)
        {
            yield return (int)Fib;
            n = n1;
            n1 = Fib;
            Fib = n + n1;
        }
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

I primi tre valori sono scritti direttamente nel codice, gli altri calcolati.

comments powered by Disqus