Two things wrong with using recursion this way.
1.
Don't use recursion except when it really is the best way to model the problem. This is almost never. In my experience, the only time I've needed recursion was when navigating a tree data structure. Even the textbook examples like factorials and fibonacci numbers shouldn't really be implemented with recursion; they're just handy for demonstrating how recursion works.
2.
You can't recurse infinitely. Every time you enter a function, data is pushed onto your program's stack, and every time you leave a function, data is popped off the stack. This basically means that recursion eats up stack space -- the deeper you recurse, the more space you use -- until you return out of the recursive function. It's pretty easy to run out of stack space this way, at which point your program will crash.
for(int i = 0; i <= 2; i++) {
if(players.dead)i++;
Its always a bad idea to manually increment the for loop from within. Change that condition to check if the player is not dead and enclose the rest of the code in the loop in it.
I disagree that it's necessarily a bad idea to increment the counter, but in this case it does indeed make little sense. At the very least it could have been written,
if(players[ i ].dead) break;
(I'm only adding spaces around the "i" so the stupid forum won't think it's BBCode). In fact, without the break, I don't understand how this code is supposed to work.
And by the way, you usually shouldn't use <= in a for loop. It confuses people.