В вашем коде есть несколько ошибок, таких как:
- вы подстраиваетесь, но также передаете позицию, вы должны сделать одну или другую
- ваш базовый случай возвращается"", но вместо этого он должен возвращать накопленную строку 'output'
- , где вы повторяете, что вы игнорируете выходные данные возвращаемого метода и просто возвращаете выходные данные в текущем методе, чтобы ничего не создавалось рекурсией
Ниже приведен код, который использует только рекурсию для анализа строки и создания выходных данных.Я добавил комментарии, чтобы показать, что происходит в коде.Обратите внимание, что, особенно в рекурсии, полезно иметь распечатку текущего состояния, чтобы вы могли видеть, что происходит на каждом этапе, поэтому я также добавил это.
Обратите внимание, что метод getMultiple () находится вСам по себе очень простой пример того, как должна работать рекурсия: вы вызываете один и тот же метод, но либо А) передаете некоторую работу, выполненную в текущем вызове, чтобы его можно было получить в базовом случае, либо Б) берут выходные данные метода идобавьте что-нибудь к нему / измените его перед возвратом измененного вывода.
public class Recursion {
public static void main(String[] args) {
System.out.println(uncompress("10a2b"));
}
public static String uncompress(String compressedText) {
return uncompress(compressedText, "", "");
}
public static String getMultiple(char x, int N) {
if (N == 0) return "";
return ""+x+getMultiple(x,N-1);
}
public static String uncompress(String text, String count, String output) {
System.out.println("----");
System.out.println("TEXT:"+text);
System.out.println("COUNT:"+count);
System.out.println("OUTPUT:"+output);
if (text.equals("")) {
//base case - no text left to parse
return output;
}
if (Character.isLetter(text.charAt(0))) {
//letter case - need to take the count we have accrued, parse it into an integer and add to output
System.out.println(count);// * text.charAt(0);
output += getMultiple(text.charAt(0),Integer.parseInt(count));
count = "";
}
else if(Character.isDigit(text.charAt(0))) {
//digit case - need to add to the count but keep as a string because must be parsed later
count += (""+text.charAt(0));
}
//parse the *remainder* of the string, one character at a time, so pass in the substring(1)
return uncompress(text.substring(1), count, output);
}
}