1:  [TestMethod]2: public void FibonacciSequanceTest(){
3: Func<int, int> fib = null;
   4:      5:     Assert.AreEqual(0, fib(0));   6:  }   1:  [TestMethod]2: public void FibonacciSequanceTest(){
3: Func<int, int> fib = (n) => { return n; };
   4:      5:     Assert.AreEqual(0, fib(0));   6:  }Step 3: Adding another testcase
   1:  [TestMethod]2: public void FibonacciSequanceTest(){
3: Func<int, int> fib = (n) => { return n; };
   4:      5:      6:      Assert.AreEqual(0, fib(0));   7:      Assert.AreEqual(1, fib(1));   8:  }Step 4: Removing duplication in the asserts
   1:  [TestMethod]2: public void FibonacciSequanceTest(){
3: Func<int, int> fib = (n) => { return n; };
   4:   5: Assert.AreEqual(0, fib(0));
6: Assert.AreEqual(1, fib(1));
   7:  }   1:  [TestMethod]2: public void FibonacciSequanceTest(){
3: Func<int, int> fib = (n) => {
4: return n;
   5:      };   6:   7: Dictionary<int, int> fibonacciSequence = new Dictionary<int, int>{
   8:                  {0 , 0},   9:                  {1 , 1},  10:              };  11:   12: foreach (KeyValuePair<int, int> row in fibonacciSequence)
  13:      {  14:          Assert.AreEqual(row.Value, fib(row.Key));  15:      }  16:  }   1:  [TestMethod]2: public void FibonacciSequanceTest(){
3: Func<int, int> fib = (n) => {
4: return n;
   5:      };   6:   7: Dictionary<int, int> fibonacciSequence = new Dictionary<int, int>{
   8:                  {0 , 0},   9:                  {1 , 1},  10:                  {2 , 1},  11:              };  12:   13: foreach (KeyValuePair<int, int> row in fibonacciSequence)
  14:      {  15:          Assert.AreEqual(row.Value, fib(row.Key));  16:      }  17:  }Ok lets fix it:
   1:  [TestMethod]2: public void FibonacciSequanceTest(){
3: Func<int, int> fib = (n) => {
4: if (n < 2) return n;
5: return 1;
   6:      };   7:   8: Dictionary<int, int> fibonacciSequence = new Dictionary<int, int>{
   9:                  {0 , 0},  10:                  {1 , 1},11: {2 , 1},
  12:              };  13:   14: foreach (KeyValuePair<int, int> row in fibonacciSequence)
  15:      {  16:          Assert.AreEqual(row.Value, fib(row.Key));  17:      }  18:  }Step 6: Adding another test case and taking 2 steps at the time since 1 will never equal 2 but 1 = 2-1 and 2 = 3-1 and thus return n-1 will do the trick for now
   1:  [TestMethod]2: public void FibonacciSequanceTest(){
3: Func<int, int> fib = (n) => {
4: if (n < 2) return n;
5: return n - 1;
   6:      };   7:   8: Dictionary<int, int> fibonacciSequence = new Dictionary<int, int>{
   9:                  {0 , 0},  10:                  {1 , 1},  11:                  {2 , 1},  12:                  {3 , 2}  13:              };  14:   15: foreach (KeyValuePair<int, int> row in fibonacciSequence)
  16:      {  17:          Assert.AreEqual(row.Value, fib(row.Key));  18:      }  19:  }   1:  [TestMethod]2: public void FibonacciSequanceTest(){
3: Func<int, int> fib = (n) => {
4: if (n < 2) return n;
5: return n - 1;
   6:      };   7:   8: Dictionary<int, int> fibonacciSequence = new Dictionary<int, int>{
   9:                  {0 , 0},  10:                  {1 , 1},  11:                  {2 , 1},  12:                  {3 , 2},13: {4 , 3},
14: {5 , 5}
  15:              };  16:   17: foreach (KeyValuePair<int, int> row in fibonacciSequence)
  18:      {  19:          Assert.AreEqual(row.Value, fib(row.Key));  20:      }  21:  }The solution (fast forwarded):
Because 5 = 2 + 3
From the testcases we can see that fib(3) = 2 and fib(4)=3
And thus 5 = fib(3) + fib(4)
3 = 5 - 2 and 4 = 5 - 1
5 = n and this 5 = fib(n-2) + fib(n-1)
   1:  [TestMethod]2: public void FibonacciSequanceTest(){
3: Func<int, int> fib = (n) => {
4: if (n < 2) return n;
5: return fib(n - 1) + fib(n - 2);
   6:      };   7:   8: Dictionary<int, int> fibonacciSequence = new Dictionary<int, int>{
   9:                  {0 , 0},  10:                  {1 , 1},  11:                  {2 , 1},  12:                  {3 , 2},  13:                  {4 , 3},  14:                  {5 , 5}  15:              };  16:   17: foreach (KeyValuePair<int, int> row in fibonacciSequence)
  18:      {  19:          Assert.AreEqual(row.Value, fib(row.Key));  20:      }  21:  }The fix:
   1:  [TestMethod]2: public void FibonacciSequanceTest(){
3: Func<int, int> fib = null;
   4:          fib = (n) => {5: if (n < 2) return n;
6: return fib(n - 2) + fib(n - 1);
   7:      };   8:   9: Dictionary<int, int> fibonacciSequence = new Dictionary<int, int>{
  10:                  {0 , 0},  11:                  {1 , 1},  12:                  {2 , 1},  13:                  {3 , 2},  14:                  {4 , 3},  15:                  {5 , 5}  16:              };  17:   18: foreach (KeyValuePair<int, int> row in fibonacciSequence)
  19:      {  20:          Assert.AreEqual(row.Value, fib(row.Key));  21:      }  22:  }Et voila done!
