#define  WITH_FIBO_CACHE

using System;

class MainClass
{
    // mehr macht bei double keinen Sinn
    private static double[]adftFiboBuffer = new double[2000];
    
    public static void Main(string[] args)
        {
        
        int nZahl;

        Console.Write("Fibonacci bis: ");
        nZahl = Convert.ToInt32(Console.ReadLine());

        // rekursive Lösung
        for (int i = 0; i <= nZahl; i++)
            Console.WriteLine("Fib({0}) = {1}",i,fibonacci(i));

        // iterative Lösung:
        // Variablen fuer fib(n-2), fib(n-1) und fib(n)
        double dftFib2, dftFib1, dftFib;
        
        dftFib2 = 0.0; dftFib1 = 1.0; 
        
        for (int i = 2; i <= nZahl; i++)
            {
            // nach Vorschrift
            dftFib = dftFib2 + dftFib1;
            Console.WriteLine("Fib({0}) = {1}",i,dftFib);
            // und jetzt den Inhalt verschieben...
            dftFib2 = dftFib1;
            dftFib1 = dftFib;
            }
        }
        
    static double fibonacci(int n)
        {
        double dftFib;
        if (0 == n)
            return 0;
        
        // der Fibonacci-cache
#if WITH_FIBO_CACHE
        if (n < adftFiboBuffer.Length && adftFiboBuffer[n] > 0.0) 
            {
            return adftFiboBuffer[n];
            } 
#endif      
        if (n < 3)
            dftFib = 1;
        else
            dftFib = fibonacci(n-1) + fibonacci (n-2);
        
        // cache belegen
        adftFiboBuffer[n] = dftFib;
        return dftFib;
        }

        
} // class

syntax highlighted by Code2HTML, v. 0.9.1