我正在尝试使用助手编写一个递归静态方法,以便反转字符串。为什么我会"stack overflow?"



,因此标题所说,我想在Java中编写静态方法,该方法采用字符串(例如" Hello!"(,并使用辅助递归方法对其进行逆转。但是,我会得到堆栈溢出错误。我的代码是:

  public static String reverse2(String text){
    return reverseHelp(text, "", text.length()-1);
  }
  public static String reverseHelp(String text, String newString, int index) {
    if(index <= 0){
      return newString;
    }
    else
    {
      index = text.length()-1;
      return newString = text.charAt(index) + reverseHelp(text, newString, index - 1);
    }
  }

我要做的是将最后一个字符附加到新字符串中。我该如何工作?

您每次都将索引设置为text.length(( - 1。您实际上并没有占用索引值(您将其作为参数传递,而是每次覆盖它(。由于您实际上并没有更改字符串的长度,因此您将永远无法脱离递归功能,因此堆栈溢出错误。

 public static String reverse2(String text){
    return reverseHelp(text, "", text.length()-1);
  }
  public static String reverseHelp(String text, String newString, int index){
    if(index < 0){
      return newString;
    }
    else
    {
      index = text.length()-1;
      return newString = text.charAt(index) + reverseHelp(text.substring(0,index), newString, index - 1);
    }
  }

2错误,第一个是reverseHelp(text.substring(0,index), newString, index - 1);,您需要在较小的字符串上重新浏览,否则它不会终止。

第二个是if(index < 0){,否则错过了第一个/最后一个字符。

但是仍然有一些代码质量问题。

您不需要在上一个语句上分配,也不再需要通过索引来通过,随着字符串正在更改。

或者,如果您每次都不为索引分配新值,则无法串联。

终极,这解决了:

  public static String reverse2(String text){
    return reverseHelp(text, "", text.length()-1);
  }
  public static String reverseHelp(String text, String newString, int index){
    if(index < 0){
      return newString;
    }
    else{
     return newString = text.charAt(index) + reverseHelp(text, newString, index - 1); 
    }
  }

您的解决方案无法奏效的原因,因为您的方法是静态的,而您的变量String text在局部行为&amp;因此text.length() - 1每次导致堆栈溢出都会给出相同的值。

如果将文本变量作为静态类成员&amp;使用它

,如果您制作

更好

int len = text.length()

作为静态成员,并用LEN代替text.length()您的代码将起作用。

最新更新