在Java中使用递归反转字符串

时间:2012-03-15 16:25:25

标签: java string recursion reverse

这是一些递归反转字符串的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 :(得分:93)

该函数接受字符串的第一个字符 - str.charAt(0) - 将其放在最后,然后调用自身 - reverse() - 在余数 - str.substring(1)上,将这两个内容添加到一起得到它的结果 - reverse(str.substring(1)) + str.charAt(0)

当传入的String是一个或更少的字符,因此没有剩余的余数 - 当str.length() <= 1)时 - 它会停止以递归方式调用自身,只返回传入的字符串。

所以它运行如下:

reverse("Hello")
(reverse("ello")) + "H"
((reverse("llo")) + "e") + "H"
(((reverse("lo")) + "l") + "e") + "H"
((((reverse("o")) + "l") + "l") + "e") + "H"
(((("o") + "l") + "l") + "e") + "H"
"olleH"

答案 1 :(得分:20)

您需要记住,您不会只有一个电话 - 您将拥有嵌套电话。因此,当“最高度嵌套”的调用立即返回时(当它只找到“o”时),下一级别将采用str.charAt(0) - 此时str为“lo”。所以这将返回“ol”。

然后 next 级别将收到“ol”,执行str.charAt(0) str(即“llo”),让“oll”回到下一个级别。

然后 next 级别将从其递归调用中接收“oll”,为{em>其值str.charAt(0)执行str(这是“ello”),让“olle”更上一层楼。

然后 final 级别将从其递归调用中接收“oll”,为{em>其值str.charAt(0)执行str(这是“你好”),将“olleh”归还给原来的来电者。

在你去的时候考虑堆栈可能是有意义的:

// Most deeply nested call first...
reverse("o") -> returns "o"
reverse("lo") -> adds 'l', returns "ol" 
reverse("llo") -> adds 'l', returns "oll" 
reverse("ello") -> adds 'e', returns "olle" 
reverse("hello") -> adds 'h', returns "olleh" 

答案 2 :(得分:3)

通过调试器运行它。一切都会变得清晰。

答案 3 :(得分:2)

因为这是递归的,所以每一步的输出都是这样的:

  1. 输入“Hello”。然后该方法用“ello”调用自身,并返回结果+“H”
  2. “ello”进入。该方法使用“llo”调用自身,并返回结果+“e”
  3. 输入“llo”。该方法使用“lo”调用自身,并返回结果+“l”
  4. 输入
  5. “lo”。该方法使用“o”调用自身,并返回结果+“l”
  6. 输入“o”。该方法将命中if条件并返回“o”
  7. 现在结果如下:

    总返回值将为您提供递归调用的结果以及第一个char

    从5返回将是:“o”

    4的回报将是:“o”+“l”

    3的回报将是:“ol”+“l”

    从2返回将是:“oll”+“e”

    1的回报将是:“olle”+“H”

    这将为您提供“olleH”的结果

答案 4 :(得分:2)

内联样本;

public static String strrev(String str) {
    return !str.equals("") ? strrev(str.substring(1)) + str.charAt(0) : str;
}

答案 5 :(得分:2)

运行下面的代码 - 它打印:

  

步骤0:ello / H
  第1步:llo / e
  第2步:lo / l
  第3步:o / l
  第3步返回:ol
  第2步返回:oll
  第1步返回:olle
  第0步返回:olleH

代码:

public class Test {

    private static int i = 0;

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

    public static String reverse(String str) {
        int localI = i++;
        if ((null == str) || (str.length()  <= 1)) {
            return str;
        }
        System.out.println("Step " + localI + ": " + str.substring(1) + " / " + str.charAt(0));
        String reversed = reverse(str.substring(1)) + str.charAt(0);

        System.out.println("Step " + localI + " returns: " + reversed);
        return reversed;
    }
}

答案 6 :(得分:0)

我找到的最佳解决方案。

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&gt; java Manager 反转后的萨梅尔:reemaS 反转后的单个字符a:a 反向后的空值:null 反转后的拉胡尔:luhaR

答案 7 :(得分:0)

AFAIK,每个递归函数中都有两件事:

  1. 总是有一个停止条件

      

    if((null == str)||(str.length()<= 1)){           return str;       }

  2. 递归使用 stack 内存,该内存使用 LIFO 机制,这就是还原发生的原因。

答案 8 :(得分:0)

Class Choices 1 == 4,5,6  
Class Choices 1 == 5,6,4  
Class Choices 1 == 6,5,4  
...

答案 9 :(得分:0)

class Test {
   public static void main (String[] args){
      String input = "hello";
      System.out.println(reverse(input));
    }

    private static String reverse(String input) {
        if(input.equals("") || input == null) {
        return "";
    }
    return input.substring(input.length()-1) + reverse(input.substring(0, input.length()-1));
} }

以下是一个示例代码段,这可能会对您有所帮助。为我工作。

答案 10 :(得分:0)

在Java中反转String的另一种解决方案。

使用.toCharArray()函数将字符串转换为char数组。

.sort()

答案 11 :(得分:0)

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"
}

}

答案 12 :(得分:0)

运行以下内容,您将看到发生了什么:

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");
    }

}

答案 13 :(得分:0)

在添加charAt(0)之前,将执行对reverce(substring(1))的调用。 由于调用是嵌套的,因此在添加ex-second字符之前将调用子字符串的反向(因为这是子字符串,所以是新的第一个字符)

反向(“ello”)+“H”=“olleH”
 -------- ------- ^
         反向(“llo”)+“e”=“olle”
         --------- ^ -----
                 反向(“lo”)+“l”=“oll”
                 -------- ^ -----
                        反向(“o”)+“l”=“ol”
                        --------- ^ ----
                                  “o”=“o”

答案 14 :(得分:0)

取字符串Hello并递归运行。

所以第一个电话将返回:

return reverse(ello) + H

第二

return reverse(llo) + e

最终将返回olleH

答案 15 :(得分:-1)

import java.util.Scanner;

public class recursion{
    public static void main (String []args){

    Scanner scan = new Scanner(System.in);
    System.out.print("Input: ");
    String input = scan.nextLine();

    System.out.print("Reversed: ");
    System.out.println(reverseStringVariable(input));

    }public static String reverseStringVariable(String s) {
        String reverseStringVariable = "";

        for (int i = s.length() - 1; i != -1; i--) {
            reverseStringVariable += s.charAt(i);

        }

        return reverseStringVariable;
    }
}

答案 16 :(得分:-1)

尝试一下:

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