2015-12-04 4 views
-3
public class recursiveReverse { 

    public static String reverse(String str){ 
    if (str == null) { 
     return null; 
    } 
    if (str.length() <= 1) { 
     return str; 
    } 
    return reverse(str.substring(1)) + str.charAt(0); 
    } 

    public static void main(String[] args) { 
    reverse("car"); 
    } 
} 

Я получаю в первый раз if (str.length() < = 1) возвращает true, затем я теряюсь.Я не понимаю процесс этого кода. Я был бы очень признателен, если бы кто-то мог проследить его для меня

+4

Вы пробовали переходить через него в отладчик? – resueman

+0

Да, он просто получил рекурсивный звонок и остался там. Было не очень полезно, но есть большая вероятность, что есть лучший способ пройти через него, о котором я не знаю. –

+1

Единственный способ понять рекурсию - пройти через нее итерацию путем итерации с помощью бумаги и карандаша или в отладчике. –

ответ

0

Давайте возьмем его по одной линии за раз.

Если строка в обратном порядке равна нулю, метод возвращает значение null.

Если строка для изменения как длина < = 1, она возвращается как есть.

Если строка длиннее, она вернет восстановленную подстроку, начиная с позиции 1, объединенной с первым символом строки.

Итак: назад ("а") -> а

обратного ("AB") -> обратная ("B") + "а" -> "ба"

обратное ("абв") -> обратный ("БК") + а -> обратный ("с") + "б" + "а"

т.д.

1

Как уже отмечалось, вы бы хорошо обслуживается путем ввода кода под отладчиком.

Вот код с "Printf в":

Test.java =>

public class Test { 

    public static String reverse(String str){ 
    System.out.println("-->str=" + str); 
    if (str == null) { 
     System.out.println("<--str=null"); 
     return null; 
    } 
    if (str.length() <= 1) { 
     System.out.println("<--str=str"); 
     return str; 
    } 
    String result = reverse(str.substring(1)) + str.charAt(0); 
    System.out.println("<--result=" + result); 
    return result; 
    } 

    public static void main(String[] args) { 
    reverse("car"); 
    } 
} 

выход, Java Test =>

-->str=car 
-->str=ar 
-->str=r 
<--str=str; 
<--result=ra 
<--result=rac 
+0

. Это управляемый вывод: p .. System.out.println ("<- str = str"); должен быть System.out.println ("<- str =" + str); – StackFlowed

0

Это рекурсивный вызов отменить функцию, пока длина строки достигает одного символа.

В приведенном выше случае строкой для возврата является АВТОМОБИЛЬ. В первом проходе он станет {обратного (АР) + С} Во втором проходе он станет {обратного (R) + А} В третьем проходе это получить значение REVERSE (R) в качестве R

который будет в качестве окончательного ответа получим R + A + C = RAC.