I know this is somewhat the reverse of the issue people are having when they ask about a stack overflow issue, but if I create a function and call it as follows, I never receive any errors, and the application simply grinds up a core of my CPU until I force-quit it:
let rec recursionTest x =
recursionTest x
recursionTest 1
Of course I can change this out so it actually does something like this:
let rec recursionTest (x: uint64) =
recursionTest (x + 1UL)
recursionTest 0UL
This way I can occasionally put a breakpoint in my code and see the value of x is going up rather quickly, but it still doesn't complain. Does F# not mind infinite recursion?
Your recursionTest
function is tail recursive, which means all recursive calls occurs in the 'tail position' i.e. as the last action in the function. This means the F# compiler does not need to allocate a new stack frame for recursive calls, so no stack overflow occurs.
Tail recursion is a specific case of tail call, the tail call being to itself rather than some other function.
In general, F# emits the tailcall instruction that .NET honors:
http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.tailcall(v=vs.95).aspx
In some specific simple cases, like yours, F# rewrites programs that use recursion into equivalent programs using loops.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With