Tail recursion can always be replaced by looping, which will be considerably faster. Some JVMs perform tail-call optimization, while others do not. Thus, tail-recursive solutions may have considerably different performance characteristics on different virtual machines.
Example:
int factorial(int val, int runningVal) { if (val == 1) { return runningVal; } else { return factorial(val - 1, runningVal * val); } }
After the quick-fix is applied:
int factorial(int val, int runningVal) { while (true) { if (val == 1) { return runningVal; } else { runningVal = runningVal * val; val = val - 1; } } }