Вы получаете исключение переполнения только для целочисленных и длинных типов. Чтобы избежать этого, вы можете использовать System.Double или System.Numerics.BigInteger (или BigDecimal, я думаю).
Например,
если вы запускаете 3 разные версии факториала: 1 с длинной, 1 с двойной и 1 с biginteger, как следует, с диапазоном значений от 5 до 50 на 5:
'Long Factorial
Public Function FactorialInt64(ByVal n As Integer) As Int64
If n = 1 Then
Return 1
Else
Return n * FactorialInt64(n - 1)
End If
End Function
' Double Factorial
Public Function FactorialDouble(ByVal n As Integer) As Double
If n = 1 Then
Return 1
Else
Return n * FactorialDouble(n - 1)
End If
End Function
' BigInteger Factorial
Public Function FactorialBigInteger(ByVal n As Integer) As BigInteger
If n = 1 Then
Return 1
Else
Return n * FactorialBigInteger(n - 1)
End If
End Function
Вы получите такой результат:
Вы можете найти полный исходный код в моем блоге: Факториал и Фибоначчи в VB.NET