Это должно решить проблему:
static String recursiveString(String str) {
return !str.equals("") ? recursiveString(str.substring(1)) + str.charAt(0) : str;
}
В вашем коде вы не уменьшаете длину строкового параметра, это всегда один и тот же вход, поэтому в основном он входит в бесконечный цикл.Если мы переместим часть конкатенации после рекурсивного вызова, то строка будет короче для каждого рекурсивного вызова, пока она не станет пустой, сигнализируя об окончании рекурсии.