Метод рекурсивного обратного слова не может пройти первую букву

Когда я запускаю класс тестера, он не может пройти первую букву. Он выводит "!" отметьте вместо того, чтобы продолжать печатать остальную часть слова в обратном порядке. Не могу понять, почему он продолжает зависать. Рекурсивный метод, кажется, застрял и не может продолжаться после первого символа. Вместо того, чтобы печатать «!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");
   }
}

person javaProgrammer    schedule 12.03.2015    source источник
comment
возможный дубликат рекурсивного метода обратной строки   -  person Jason    schedule 12.03.2015


Ответы (3)


Судя по вашему коду, ваш обратный метод работает - он возвращает обратную сторону исходного текста. Однако он делает это, изменяя значение 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");
}
person Jason    schedule 12.03.2015

Надеюсь, вам это нравится. Просто для информации, вы можете использовать ниже -

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

Еще одна вещь, ваш код не будет работать, если вы передадите null :)

Проблема с вашим кодом в том, что вы изменяете текст в блоке else.

text = text.substring(1);

Таким образом, в конце он содержит только !

person Kartic    schedule 12.03.2015
comment
Хотя это обеспечивает необходимую общую функциональность, оно не решает конкретную проблему, о которой спрашивает OP. - person Jason; 12.03.2015
comment
Но этот последний символ добавляется ко всем остальным символам на обратном пути из стека вызовов. Настоящая проблема заключается в том, что text каждый раз изменяется, а затем OP печатает только text, а не результат метода reverse(). - person Jason; 12.03.2015

Вот окончательная программа (просто изменен оператор возврата):

/** Класс переворачивает текст слова */

Предложение публичного класса { 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 (text=reverse() + val); } } }

the reason is simple - String is immutable. Every time you want it to change assign it back again.

person Anshuman    schedule 12.03.2015