Не работает рекурсивный метод в Java

240
15 июня 2018, 21:20

Нужно сделать рекурсивный метод,при вызове которого получалось бы следующее:

repeat("hello", 3)  "hellohellohello"
repeat("this is fun", 1)    "this is fun"
repeat("wow", 0)    ""
repeat("hi ho! ", 5)    "hi ho! hi ho! hi ho! hi ho! hi ho! "

Вот мой код

public class Test{
public static String repeat(String sint n) {
    String a="";
    if(n < 0){
        throw new IllegalArgumentException();
        }
    else if(n==0){
        return a;
    }
    else {
    a=a+s;
    n--;
      }
        return repeat(a,n);
}
public static void main(String[]args){
repeat("hello", 3);
}
}

По заданию,при вводе отрицательного числа должно выбрасываться исключение,при вводе нуля метод должен возвращать пустую строку.Эти части кода работают.Не работает сама рекурсия,всегда возвращается пустая строка.Пробовал return repeat(a,n); перенести в

else {
        a=a+s;
        n--;
        return repeat(a,n);
         }

Вывод тот же.В чём проблема?Это задание на рекурсию,через цикл нельзя сделать.         

Answer 1
else if(n==0){
    return a;
}

Когда доходит до дна рекурсии, в этот момент возвращается пустая строка. На самом деле, идея сделать tail recursion хороша, но с ограничением на только два аргумента вряд ли получится.

Поэтому придется более stack-unfriendly: в основном случае (n > 0) нужно сделать что-то вроде return s + repeat(s, n - 1);.

Answer 2

как то так:

    public class RecursiveHelp {
        static String recursiveRepeat(String s, int n) {
            if (n == 0) {
                return "";
            } else if (n < 0) {
                throw new IllegalArgumentException("n должно быть больше 0");
            }
            return s + recursiveRepeat(s, --n);
        }
        public static void main(String[] args) {
            System.out.println(recursiveRepeat("hello", 3));
            System.out.println(recursiveRepeat("this is fun", 1));
            System.out.println(recursiveRepeat("wow", 0));
            System.out.println(recursiveRepeat("hi ho! ", 5));
        }
    }
Answer 3

У вас a либо пуста, когда n == 0, либо равно s.

public class Test{
    public static String repeat(String a, String sum, int n) {
        if (n < 0) {
            throw new IllegalArgumentException();
        }
        return n == 0 ? sum : repeat(a, sum + a, --n);
    }
    public static void main(String[]args){
        System.out.println(repeat("hello", "", 3));
    }
}
READ ALSO
Как получить доступ к полям классов

Как получить доступ к полям классов

Помогите разобраться в этом сложном для меня моментеУ меня есть два класса сущностей User и Hotel, у них поля long id и геттеры

209
Корректный деплой spring boot на tomcat

Корректный деплой spring boot на tomcat

Есть приложение Spring Boot, которое запускается и работает корректноНастроил его для генерации war-ника согласно документации Spring

200
Переключатель boolean

Переключатель boolean

Мой вопрос очень прост для программистов со стажемМне просто нужно, чтобы по клику менялось значение boolean с true на false и обратно

214