Сторнирование строки с помощью рекурсии в Java - PullRequest
47 голосов
/ 15 марта 2012

Вот некоторый Java-код для рекурсивного изменения строки.

Может ли кто-нибудь объяснить, как это работает?

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

Я не понимаю, как это может работать.

Ответы [ 17 ]

0 голосов
/ 15 августа 2015
public class ReverseString{

private static  String reverse(String text, String reverseStr){
    if(text == null || text.length() == 0){
        return reverseStr;
    }
    return reverse(text.substring(1), text.charAt(0)+reverseStr);
}
public static void main(String [] args){
    System.out.println(reverse("hello", "")); //output is "olleh"
}

}

0 голосов
/ 15 марта 2012

запустите следующее, и вы увидите, что происходит:

public class RS {

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

    public static char charAt(String s) {
        System.out.println("--- charAt --- " + s);
        return s.charAt(0);
    }

    public static String add(String s, char c) {
        System.out.println("--- add --- " + s + " - " + c);
        return s + c;
    }

    public static void main(String[] args) {
        System.out.println("start");
        System.out.println("result: " + reverse("hello"));
        System.out.println("end");
    }

}
0 голосов
/ 15 марта 2012

Вызов реверса (substring (1)) будет выполнен перед добавлением charAt (0).так как вызов является вложенным, обратный вызов подстроки будет вызываться перед добавлением экс-второго символа (нового первого символа, поскольку это подстрока)

reverse ("ello") + "H" ="olleH"
-------- ^ -------
reverse ("llo") + "e" = "olle"
--------- ^ -----
реверс ("lo") + "l" = "oll"
-------- ^ -----
реверс ("o")+ "l" = "ol"
--------- ^ ----
"o" = "o"

0 голосов
/ 15 марта 2012

Возьмите строку Hello и выполните ее рекурсивно.

Итак, первый вызов вернется:

return reverse(ello) + H

Второй

return reverse(llo) + e

, который в итоге вернет olleH

0 голосов
/ 02 мая 2019

AFAIK, в каждой функции рекурсии есть 2 вещи:

  1. Всегда есть условие остановки , которое:

    if ((null == str) || (str.length ()

  2. Рекурсия использует стек память, которая использует механизм LIFO , поэтому происходит возврат.

0 голосов
/ 24 мая 2019

Попробуйте это:

public static String reverse(String str) {
   return (str == null || str.length()==0) ? str : reverseString2(str.substring(1))+str.charAt(0);
}
0 голосов
/ 23 мая 2014

Лучшее решение, которое я нашел.

public class Manager
{
    public static void main(String[] args)
    {
        System.out.println("Sameer after reverse : " 
                         + Manager.reverse("Sameer"));
        System.out.println("Single Character a after reverse : " 
                         + Manager.reverse("a"));
        System.out.println("Null Value after reverse : "
                         + Manager.reverse(null));
        System.out.println("Rahul after reverse : "
                         + Manager.reverse("Rahul"));
    }

    public static String reverse(String args)
    {
        if(args == null || args.length() < 1 
                                || args.length() == 1)
        {
            return args;
        }
        else
        {
                return "" + 
                               args.charAt(args.length()-1) + 
                               reverse(args.substring(0, args.length()-1));                                  
        }
    }
}

Вывод: C: \ Users \ admin \ Desktop> java Manager Самир после реверса: reemaS Один символ после обратного: Нулевое значение после обратного: ноль Рахул после реверса: luhaR

...