I’m embarrassed, and not just a little. I mean a lot.
I made a blogpost about the yield keyword and the fibonacci sequence and did not even check if I got the correct results. I just checked if the code ran.
I was wrong and I was stupid. I would never do this in production. My main application has over 9k tests before I let it go in production.
But for my blogposts I sometimes go to quickly.
It looks ok, hit Publish.
And then this happens.
Great explanation of the Yield keyword. However, there is a logic error in the Fibs function of your “less pretty” code. Here is the output …1,1,2,4,8,16,32, etc… It should be … 1,1,2,3,5,8,13,etc… to be a true Fibonacci series. I tried including my fix for that but had trouble attaching the code so I gave up.
Does this make me a Fibonazi? 😉
I am ashamed. I really am. And I say sorry to my readers. I should do better.
So I’ll make up for it.
Here are my tests.
```vbnet Imports Nunit.FrameWork
Namespace DefaultNamespace Public Class TestFibonaci <Test> Public sub IfFirstNumberIs1 Dim fibonacci = New Fibonacci().Result Assert.AreEqual(1, fibonacci(0)) End Sub
<Test>
Public Sub IfSecondNumberIs1()
Dim fibonacci = New Fibonacci().Result
Assert.AreEqual(1, fibonacci(1))
End Sub
<Test>
Public Sub IfThirdNumberIs2()
Dim fibonacci = New Fibonacci().Result
Assert.AreEqual(2, fibonacci(2))
End Sub
<Test>
Public Sub IfFourthNumberIs3()
Dim fibonacci = New Fibonacci().Result
Assert.AreEqual(3, fibonacci(3))
End Sub
<Test>
Public Sub IfFifthNumberIs5()
Dim fibonacci = New Fibonacci().Result
Assert.AreEqual(5, fibonacci(4))
End Sub
<Test>
Public Sub IfSixthNumberIs8()
Dim fibonacci = New Fibonacci().Result
Assert.AreEqual(8, fibonacci(5))
End Sub
<Test>
Public Sub IfSeventhNumberIs13()
Dim fibonacci = New Fibonacci().Result
Assert.AreEqual(13, fibonacci(6))
End Sub
End Class
End Namespace``` And here is the class with the code I published.
vbnet
Namespace DefaultNamespace
Public Class Fibonacci
Public Iterator Function Result() As IEnumerable(Of Integer)
Dim previous As Integer
Dim current As Integer
Yield 1
Yield 1
previous = 1
current = 1
While current < Integer.MaxValue - previous
current += previous
previous = current
Yield current
End While
End Function
End Class
End NameSpace
And this is what ncrunch tells me I should have seen before posting that piece of crap.
Oh man, that is so wrong. Let’s fix it.
vbnet
Namespace DefaultNamespace
Public Class Fibonacci
Public Iterator Function Result() As IEnumerable(Of Integer)
Dim previous As Integer
Dim current As Integer
Yield 1
Yield 1
previous = 1
current = 1
While current < Integer.MaxValue - previous
Dim tempprevious = current
current += previous
previous = tempprevious
Yield current
End While
End Function
End Class
End NameSpace
And now I can be reasonably sure that it works as it should.
And now I can easily play with it and see that the shorter version gives me the same correct results.
```vbnet Namespace DefaultNamespace Public Class Fibonacci Public Iterator Function Result() As IEnumerable(Of Integer) Yield 1 Yield 1
For Each n In Me.Result.Zip(Me.Result.Skip(1), Function(x, y) x + y)
Yield n
Next
End Function
End Class
End NameSpace``` Lesson learned.
And once again, SORRY.