It's a known bug that's been around forever, but it's one which doesn't seem to affect many people, so it's always been a low priority issue. I don't think many people use functions recursively, so most never experience the issue.
I've did a little digging into the problem before, and it seems as if it's a case of QB64 mistaking the name as a variable and not the function. Under the hood, QB64 translates our code to C, then it compiles. With the translation, variable names are changed slightly, so as to avoid confusion.
S = 2 may become SINGLE_S, or LONG_S, depending on the default variable type. Functions are usually called FUNC_name (this is all if my memory isn't failing me again), and the issue is the line basically translates itself to:
FUNC_F = SINGLE_F - 1
When we use a parameter, QB64 correctly identifies the translation as a function, and all works as it should with FUNC_F = FUNC_F(dummyvalue) - 1...
***************
It sounds like a simple enough issue, but it's one that's hard to dig down and find inside QB64 itself. To be honest, I'm not even 100% certain which part of QB64 does these exemptions/identifications for us...
Everyone needs to remember: Galleon was the one who originally wrote QB64, and all the rest of us are just trying to sort through someone else's long -- undocumented -- spaghetti code, and sometimes, some issues are difficult to track and correct, like this one. :)