I am inspired by Andrew Hare's lazy loading fibonacci to rewrite my fibonacci before http://www.ienablemuch.com/2010/09/fibonacci-using-sql.html to lazy loading approach:
using System;
using System.Collections.Generic;
using System.Linq;
namespace Fibonacci
{
class MainClass
{
public static void Main (string[] args)
{
Console.WriteLine("Sans list. Lazy load stuff:");
int i = 0;
foreach(int n in Fibonacci().Take(10))
{
++i;
Console.WriteLine("Loading {0} {1}", i, n);
}
Console.WriteLine("\nPick the 20th fibonacci:");
Console.WriteLine("\n20th fibonacci: {0}",
Fibonacci().Skip(20 - 1).Take(1).Single());
Console.WriteLine("\nEagerly load everything in list:");
i = 0;
foreach(int n in Fibonacci().Take(10).ToList())
{
++i;
Console.Write("\nEager loading {0} {1}", i, n);
}
}
static IEnumerable<int> Fibonacci()
{
int a = 0, b = 1;
for(;;)
{
Console.Write("Lazy");
yield return a;
int n = a;
a += b;
b = n;
}
}
}//class
}
Output:
Sans list. Lazy load stuff:
LazyLoading 1 0
LazyLoading 2 1
LazyLoading 3 1
LazyLoading 4 2
LazyLoading 5 3
LazyLoading 6 5
LazyLoading 7 8
LazyLoading 8 13
LazyLoading 9 21
LazyLoading 10 34
Pick the 20th fibonacci:
LazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazy
20th fibonacci: 4181
Eagerly load everything in list:
LazyLazyLazyLazyLazyLazyLazyLazyLazyLazy
Eager loading 1 0
Eager loading 2 1
Eager loading 3 1
Eager loading 4 2
Eager loading 5 3
Eager loading 6 5
Eager loading 7 8
Eager loading 8 13
Eager loading 9 21
Eager loading 10 34
At least this solution differs from others :-) this doesn't start with -1, one can use unsigned int
instead of int