Как заметил Мехрдад , лучше не использовать рекурсию. Однако, если вы его используете, вы также можете сохранять как первый, так и последний символ каждого вызова, таким образом вдвое уменьшая количество рекурсивных вызовов. То есть
public String reverseString(String s){
int len = s.length();
if (len <= 1) {
return s;
}
char fst = s.charAt(0);
char lst = s.charAt(len - 1);
return lst + reverseString(s.substring(1, len - 2)) + fst;
}
Это также обрабатывает случай пустой строки. Возможно, передача StringBuilder с соответствующей емкостью ускорит процесс, но это остается для читателя в качестве упражнения;)