Yes, if the compiler issues a command to call tail , that call will be tail recursive (like CLR 4, but there are still some exceptions where it will not actually be tail recursive). But this does not necessarily mean that the entire function is tail recursive. For example, I can imagine that the QuickSort function is compiled so that the first recursive call is not tail recursive, and the second -.
In addition, just because some function does not contain the tail command, it does not necessarily mean that it is not tail recursive. The JIT compiler can recognize a tail call even without a tail statement and optimize it as such.
What's more, the F # compiler sometimes compiles recursive functions in a non-recursive way. This is somewhat different from the usual tail call optimization, and the tail statement is not used, but the overall effect is similar.
source share