Why doesn't infinite recursion hit a stack overflow exception in F#?

.net, f#, functional-programming

Solution

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.

Problem

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?

Original source