public abstract class Transform
public class Identity : Transform
public class V1 : Transform
public readonly Transform t;
public V1(int n, Transform t)
public class V2 : Transform
public readonly Transform t;
public V2(int n, Transform t)
public static int fibRec(int n)
if (n == 0 || n == 1) return n;
return fibRec(n - 1) + fibRec(n - 2);
public static int fibIter(int nOuter)
Transform k = new Transform.Identity();
if (nIter == 0 || nIter == 1)
if (k is Transform.Identity)
var v1 = k as Transform.V1;
var v2 = k as Transform.V2;
k = new Transform.V1(nIter, v2.t);
if (restart){ continue; }
k = new Transform.V2(nIter, k);
public static void Main()
Console.WriteLine("fibRec(0): " + fibRec(0));
Console.WriteLine("fibRec(1): " + fibRec(1));
Console.WriteLine("fibRec(2): " + fibRec(2));
Console.WriteLine("fibRec(3): " + fibRec(3));
Console.WriteLine("fibRec(4): " + fibRec(4));
Console.WriteLine("fibRec(5): " + fibRec(5));
Console.WriteLine("fibIter(0): " + fibIter(0));
Console.WriteLine("fibIter(1): " + fibIter(1));
Console.WriteLine("fibIter(2): " + fibIter(2));
Console.WriteLine("fibIter(3): " + fibIter(3));
Console.WriteLine("fibIter(4): " + fibIter(4));
Console.WriteLine("fibIter(5): " + fibIter(5));