When you say memory, it seems you're talking about static fixed-size allocations, like global variables. They can't support recursion because they're fixed size with no support for a pointer to the last one in use (no indexed addressing). Registers also have both those limitations.
However, there are other things you can store in memory. e.g. the call stack is part of memory.
You could implement recursion using a "manual" stack data structure in a large fixed-size global array. That would be like the call stack, because it would eventually fault when you cause a Stack Overflow. (In a real system, the call stack has limited size, so an infinitely-recursive function will quickly segfault).
TL:DR: I think you can implement recursion with anything that you can implement a stack data structure on top of, but you can't do that with either registers or a bunch of int globals.
See also a recent answer where I explained what recursion is in asm, on a question about a made-up instruction set which the OP (incorrectly) thought didn't support call / ret.