using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
static int FibRec(int p1, int p2, int n)
return n == 0 ? p1 : FibRec(p2, p1 + p2, n - 1);
static int Fib(int n) { return FibRec(0, 1, n); }
static int Fibonachi(int n, int p1 = 0, int p2 = 1)
for (int j = 2; j < n; j++)
class FibonacciEnumerable : IEnumerable<int>
public IEnumerator<int> GetEnumerator()
IEnumerator IEnumerable.GetEnumerator()
public static void Main(string[] args)
var sp = new Stopwatch();
for (int i = 0; i < 1000; i++) x += Fib(10000);
Console.WriteLine("recurse : {0} {1}", sp.Elapsed, x);
for (int i = 0; i < 1000; i++) x += Fibonachi(10000);
Console.WriteLine("loop : {0} {1}", sp.Elapsed, x);
var fe = new FibonacciEnumerable();
for (int i = 0; i < 1000; i++) x += fe.Take(10000).Last();
Console.WriteLine("enumerable : {0} {1}", sp.Elapsed, x);
for (int i = 0; i < 10; i++) Console.Write(" " + Fib(i).ToString());
for (int i = 0; i < 10; i++) Console.Write(" " + Fibonachi(i).ToString());
for (int i = 1; i < 10; i++) Console.Write(" " + (new FibonacciEnumerable()).Take(i).Last().ToString());