fibの美容整形
まだこのネタを引っ張る気か・・・!と言われそうですが。。。
前回のヤツがどうも気に入らなかったのでもう1度。
前よりはマシかなぁ
class Fibonacci2 { public class LazyZipper<T1, T2, TResult> { private List<TResult> memo = new List<TResult>(); public IEnumerable<TResult> ZipWith( IEnumerable<T1> a, IEnumerable<T2> b, Func<T1, T2, TResult> f ) { using ( var e1 = a.GetEnumerator() ) using ( var e2 = b.GetEnumerator() ) { for ( int i = 0 ; true ; i++ ) { bool evals = memo.Count == i; if ( evals ) { if ( (e1.MoveNext() && e2.MoveNext()) == false ) break; memo.Add( f( e1.Current, e2.Current ) ); } yield return memo[ i ]; } } } } private readonly LazyZipper<uint, uint, uint> lazy = new LazyZipper<uint,uint,uint>(); public IEnumerable<uint> Fib() { yield return 1; yield return 1; foreach ( var item in this.lazy.ZipWith( Fib(), Fib().Skip( 1 ), (( x, y ) => x + y) ) ) yield return item; } public void Test1() { Fib().Take( 50 ).ToList().ForEach( x => Console.Write( "{0}.", x ) ); } }
F#がVS2010に正式採用らしいです!おめでとう!ありがとう!