尝试使用java中的递归查找字符串的反向时的StackOverflowError

时间:2015-03-15 21:33:44

标签: java recursion

我试图使用递归来查找字符串的反向,但是当我运行代码时,我得到了stackoverflower错误。我是递归的新手,所以我不确定我需要做些什么才能修复它。

public static String reverse(String string) {
        int index = 0;
        if(string == null){
            return " ";
        }
        else if(index < string.length()) {
            char a;
            a = string.charAt(index);
            index += 1;
            return a + reverse(string);
        }
        return " ";
    }

4 个答案:

答案 0 :(得分:1)

这不是递归应该如何工作,因为你只是一遍又一遍地传递相同的字符串。您可以使用递归,但有两种方法可以解决您的问题。

  1. 获取最后一个字符,并使用不具有最后一个字符的字符串调用该方法,如下所示:

    public String reverse(final String string) {
        if (string != null && !string.isEmpty()) {
            final int length = string.length();
            final char character = string.charAt(length - 1));  
            final String result = reverse(string.substring(0, length - 2));
            if (result != null)
                return String.valueOf(character) + result;
            return String.valueOf(character);
        }
        return null;
    }
    
  2. 我不应该对此进行测试,但重点是我正在更改传递的字符串,并且有一种机制来检测何时退出调用我自己的方法。

    第二种方法是在没有递归的情况下执行此操作,因为您可以使用一些for循环等来完成此操作。但为了学习,请检查1:P

答案 1 :(得分:0)

您似乎缺少的部分是将索引传递给您的函数。此外,当你递归时,你需要在结束时返回当前字符。我想你想要像

这样的东西
private static String reverse(String string, int index) {
    if (string != null && index < string.length()) {
        char a = string.charAt(index);
        return reverse(string, index + 1) + a;
    }
    return "";
}

然后,公共接口中的方法可以调用该函数,其初始index为0,如

public static String reverse(String string) {
    return reverse(string, 0);
}

当然,在实际代码中我更喜欢StringBuilder

之类的东西
public static String reverse(String string) {
    StringBuilder sb = new StringBuilder(string);
    return sb.reverse().toString();
}

答案 2 :(得分:0)

有很多问题。我已经添加了一些评论来尝试提供帮助。

public static String reverse(String string) {
    int index = 0;
    if(string == null){
        return " ";
    }
    /* This will always be true because index is always zero */
    else if(index < string.length()) {
        char a;
        /* This gets the character at position zero */
        a = string.charAt(index);
        /* This increments zero by 1 */
        index += 1;
        /* This takes the character and then calls reverse again (the recursion.
           The problem is that you are passing the full string in and so every time
           you recurse, index will be zero again and the string will be exactly the same length.
           So no exit criterion will ever be triggered. 
           As such this is an infinite recursion. */
        return a + reverse(string);
    }
    return " ";
}

我建议考虑以下事项:

  • 在最后一次递归通话中,即当你开始&#34;弹出&#34;通过每个递归调用,你期望触发它的是什么?
  • 如果您决定在每次递归调用时通过删除第一个字符来缩短字符串,那么最后一次调用将是一个空字符串。
  • 另一方面,如果您确定最后一次调用将是索引变量等于字符串长度,那么您将需要考虑传入一个额外的参数(索引)并在每次递归调用时将其增加一

答案 3 :(得分:0)

您正在初始化变量&#34;索引和&#34;每次调用递归方法。初始化方法块外的所有变量。 试试这个功能..

public static String reverse(String str){

    if(str.length()<=0||str.length()==1)
        return str;
    return reverse(str.substring(1))+str.charAt(0);
}