Fibonacci Enumerable
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