在Java中递归打印字符串的反面

在Java中递归打印字符串的反面,java,string,recursion,while-loop,Java,String,Recursion,While Loop,由于某种原因,当字符串长度为零时,它不会从while循环中出来。有人能帮我吗 static String str1 = ""; public static void reverse(String str) { while (str.length() > 0) { str1 = str1 + str.charAt(str.length() - 1); StringBuffer str_buf = new StringBuffer(str);

由于某种原因,当字符串长度为零时,它不会从while循环中出来。有人能帮我吗

static String str1 = "";

public static void reverse(String str) {
    while (str.length() > 0) {
        str1 = str1 + str.charAt(str.length() - 1);
        StringBuffer str_buf = new StringBuffer(str);
        str = str_buf.deleteCharAt(str.length() - 1).toString();
        reverse(str);
    }
    System.out.println("String is " + str1);
}

while
替换为
if

if(str.length()>0)
更新:

失败的原因是,在
str.length()
变为0后,它到达递归的底部,控制返回到“更高”级别,其中
str.length()
仍然是1。因此,它再次自称


因此,使用
while
,当它达到0后,它将在1和0之间持续循环。

按照编码的方式,您将循环整个字符串并递归调用函数。因此,对于短字符串“abcd”,第一次通过时将使用“abc”、“ab”和“a”进行反向调用。对“abc”的反向调用将调用带有“ab”和“a”的反向调用。如果递归调用函数,则不需要@sanjeev mk建议的while循环,而只需要If作为退出条件。

我相信有一种更适合递归打印字符串反转的代码:

public void reverseStringPrint(String inputString, int index){
    if (index < (inputString.lenght() - 1))
        reverseStringPrint(inputString, index + 1);
    System.out.print(inputString.charAt(index);
}
public void reverseStringPrint(字符串inputString,int索引){
如果(索引<(inputString.Length()-1))
反向打印(输入字符串,索引+1);
System.out.print(inputString.charAt(索引);
}
在索引为0的情况下运行

为了在输出端获得反向字符串(不仅仅是打印),您可以这样做:

public String reverseString(String inputString, int index){
       String restOfTheString = "";
       if (index < (inputString.lenght() - 1))
           restOfTheString = reverseStringPrint(inputString, index + 1);
       return charAt(index) + restOfTheString;
   }
publicstringreversestring(stringinputstring,int-index){
字符串字符串=”;
如果(索引<(inputString.Length()-1))
restofstring=reverseStringPrint(输入字符串,索引+1);
返回字符(索引)+返回字符串;
}

但是为什么while循环不起作用呢?毕竟它也在检查条件。此外,字符串是通过值传递的,而不是通过引用传递的。所以当您执行str=str_buf.deleteCharAt(str.length()-1)。toString()时;在内部递归中,它不会更改调用当前方法(即前一个方法)的方法中str的值recursion@EnriqueFueyo是的,但那没关系。这项工作的诀窍在于,
str1
在方法之外,因此它超越了您正在查看的方法调用。@DavidWallace确实如此er,因为while循环正在检查str.length是否大于0,但str从不更改,但
str
确实会更改。每次写入
str=str_buf.deleteCharAt(str.length()-1)。toString()
它会改变。唯一的问题是,
str
有多个副本。但所有副本都会变短,最终长度为零。即使存在
时,该程序也会终止。它只会打印出比预期多得多的内容。