
When an include is not surrounded by empty lines, its content is inlined on the same line as the adjacent content. That can lead to broken tags and other display issues. This PR fixes all such includes and introduces a validation step that forbids introducing the same problem again.
91 lines
2.3 KiB
Plaintext
91 lines
2.3 KiB
Plaintext
== Why is this an issue?
|
|
|
|
https://en.wikipedia.org/wiki/Recursion[Recursion] is a technique used to define a problem in terms of the problem itself, usually in terms of a simpler version of the problem itself.
|
|
|
|
For example, the implementation of the generator for the n-th value of the https://en.wikipedia.org/wiki/Fibonacci_sequence[Fibonacci sequence] comes naturally from its mathematical definition, when recursion is used:
|
|
|
|
[source,vbnet]
|
|
----
|
|
Function NthFibonacciNumber(ByVal n As Integer) As Integer
|
|
If n <= 1 Then
|
|
Return 1
|
|
Else
|
|
Return NthFibonacciNumber(n - 1) + NthFibonacciNumber(n - 2)
|
|
End If
|
|
End Function
|
|
----
|
|
|
|
As opposed to:
|
|
|
|
[source,vbnet]
|
|
----
|
|
Function NthFibonacciNumber(ByVal n As Integer) As Integer
|
|
Dim previous As Integer = 0
|
|
Dim last As Integer = 1
|
|
|
|
For i = 0 To n - 1
|
|
Dim temp = previous
|
|
previous = last
|
|
last = last + temp
|
|
Next
|
|
|
|
Return last
|
|
End Function
|
|
----
|
|
|
|
The use of recursion is acceptable in methods, like the one above, where you can break out of it.
|
|
|
|
[source,vbnet]
|
|
----
|
|
Function NthFibonacciNumber(ByVal n As Integer) As Integer
|
|
If n <= 1 Then
|
|
Return 1 ' Base case: stop the recursion
|
|
End If
|
|
' ...
|
|
End Function
|
|
----
|
|
|
|
It is also acceptable and makes sense in some type definitions:
|
|
|
|
[source,vbnet]
|
|
----
|
|
Class Box
|
|
Inherits IComparable(Of Box)
|
|
|
|
Public Function CompareTo(ByVal other As Box?) As Integer
|
|
' Compare the two Box instances...
|
|
End Function
|
|
End Class
|
|
----
|
|
|
|
With types, some invalid recursive definitions are caught by the compiler:
|
|
|
|
[source,vbnet]
|
|
----
|
|
Class C2(Of T) ' Error BC31447 C2(Of T) cannot reference itself in Inherits clause
|
|
Inherits C2(Of T)
|
|
End Class
|
|
|
|
Class C2(Of T)
|
|
Inherits C2(Of C2(Of T)) ' Error BC31447 C2(Of T) cannot reference itself in Inherits clause
|
|
End Class
|
|
----
|
|
|
|
In more complex scenarios, however, the code will compile but execution will result in a https://learn.microsoft.com/en-us/dotnet/api/system.typeloadexception[TypeLoadException] if you try to instantiate the class.
|
|
|
|
[source,vbnet]
|
|
----
|
|
Class C1(Of T)
|
|
End Class
|
|
|
|
Class C2(Of T) ' Noncompliant
|
|
Inherits C1(Of C2(Of C2(Of T)))
|
|
End Class
|
|
|
|
Dim c2 = New C2(Of Integer) ' This would result into a TypeLoadException
|
|
----
|
|
|
|
include::../resources.adoc[]
|
|
|
|
include::../rspecator.adoc[]
|