递归反向单词方法无法通过第一个字母



当我运行测试器类时,它无法通过第一个字母。它输出一个"!"标记,而不是继续打印单词的其余部分。不知道为什么它总是挂断。递归方法似乎卡住了,无法继续超过第一个字符。而不是打印"!olleH",我只得到"!"。谢谢!

/**
   Class reverses text of word
*/
public class Sentence
{
    private String text="";

    /**
        Constructs a sentence
        @param word
    */
    public Sentence(String textIN)
    {
        text=textIN;
    }
    /**
        gets text
        @return text
    */
    public String getText()
    {
        return text;
    }
    /**
        Reverse word
    */
    public String reverse()
    {
        if (text.length() <= 1)
        {
            return text;
        }
        else
        {
            char val = text.charAt(0);
            text=text.substring(1);
            return reverse() + val;
        }
    }
}

/**
   A tester class for reversing a sentence.
*/
public class SentenceTester
{
   public static void main(String[] args)
   {
      Sentence greeting = new Sentence("Hello!");
      greeting.reverse();
      System.out.println(greeting.getText());
      System.out.println("Expected: !olleH");
   }
}

从代码的通读来看,您的反向方法似乎有效 - 它返回原始文本的反向。但是,它通过改变text的值来做到这一点,并且它永远不会将最终值放入text

实际发生的是,text变短了一个字符(从前面删除),直到只剩下一个字符 - ! .

因此,您可以在主要方法中解决问题:

public static void main(String[] args)
{
    Sentence greeting = new Sentence("Hello!");
    String result = greeting.reverse();
    System.out.println(result);
    System.out.println("Expected: !olleH");
}

我希望你喜欢这样。仅供参考,您可以在下面使用 -

String reversedString = new StringBuilder("Original String").reverse().toString();

还有一件事,如果您传递空值,您的代码将不起作用:)

你的代码的问题是,你正在修改else块中的文本。

text = text.substring(1);

所以最后它只成立

这是最终程序(刚刚更改了 return 语句):

      

/**类反转单词的文本*/

公开课 句子{ 私有字符串文本=";

/** Constructs a sentence @param word */ public Sentence(String textIN) { text=textIN; } /** gets text @return text */ public String getText() { return text; } /** Reverse word */ public String reverse() { if (text.length() <= 1) { return text; } else { char val = text.charAt(0); text=text.substring(1); return (text=reverse() + val); } } }

原因很简单 - 字符串是不可变的。每次您希望更改它时,请再次将其重新分配。

最新更新