Java递归:为什么赢了';我的递归方法不能调用回它自己吗?

Java递归:为什么赢了';我的递归方法不能调用回它自己吗?,java,recursion,Java,Recursion,我是编程新手,无法解决这个问题。我尝试过改变静态,以不同的方式调用该方法,但仍然无法让它自己调用。程序的要点是让用户输入一个字符串,然后输出字符串的倒数 public class StringReverse { public static String reverse(String s) { int i = s.length()-1; String letter = ""; if(i == 0) {

我是编程新手,无法解决这个问题。我尝试过改变静态,以不同的方式调用该方法,但仍然无法让它自己调用。程序的要点是让用户输入一个字符串,然后输出字符串的倒数

public class StringReverse
{
    public static String reverse(String s)
    {
        int i = s.length()-1;
        String letter = "";

        if(i == 0)
        {
            return""; //Base Case for the recusive method.
        }
        else
        {
            return letter = s.substring(s.length() - 1) + reverse(s.substring(s.length() - 1));
        }
    }

    public static void main(String[] args)
    {
        String input = "";
        Scanner in = new Scanner(System.in);

        do{
            System.out.println("\nEnter q to quit.");
            System.out.println("Enter a word...(No UpperCase letters)");
            input = in.nextLine();
            String reversedWord = reverse(input);
            System.out.print(reversedWord); 
        }while(!input.equals("q"));
    }   
}
当你打电话的时候

s.substring(s.length() - 1)

您仅用最后一个字符调用它。效果不能是字符串反转。

我想您应该这样做:

return letter = s.substring(s.length() - 1) + reverse(s.substring(0, s.length() - 1));
更新:

哦,还有:

int i = s.length();

这是您的反转函数:

public static String reverse(String s)
{
    if(s.length() <= 1)
    {
        return s;
    }
    else
    {
        return s.substring(s.length()-1) + reverse(s.substring(0,s.length()-1));
    }
}
公共静态字符串反转(字符串s)
{
如果(s.长度()
这就是答案。以下是你做错了什么:


首先,您只返回了最后一个字符。s.substring(int x)从位置x处的字符到字符串的末尾。其次,由于每次都返回-1,因此基本大小写应为-1。问题如下所示:

return letter = s.substring(s.length() - 1) + reverse(s.substring(s.length() - 1));
看来你是在返回最后一个字母,以及在最后一个字母上调用reverse的值。我想你真的是想这样做的

return letter = s.substring(s.length() - 1) + reverse(s.substring(0, s.length() - 1));
如果使用字符串“ABC”调用,则第一次迭代将给出如下结果:

"C" + reverse("AB")

不需要创建不必要的变量。简单明了

public static String reverse(String s) {
    if (s == null || s.length() < 1)
        return "";
    return s.substring(s.length() - 1) + reverse(s.substring(0, s.length() - 1));
}
公共静态字符串反转(字符串s){
如果(s==null | | s.length()<1)
返回“”;
返回s.substring(s.length()-1)+reverse(s.substring(0,s.length()-1));
}

递归正在工作,但您传入了错误的输入。这就是您想要的:

    public static String reverse(String s)
    {
        int i = s.length()-1;

        if(i == -1)
            return "";
        return s.substring(i) + reverse(s.substring(0, i));
    }

有两个原因导致你的方法不起作用。一个是,通过测试基本情况下的i==0而不是i==-1,你总是会切掉向后字符串的最后一个字母。第二个是,当你调用递归方法时,你只传入字符串的最后一个字符,而不是字符串的最后一个字符以外的所有字符。

是的,这是错误的这是最好的实现。您可以测试null,但当传递null值时返回“”可能会隐藏错误。有些人会抛出InvalidArgumentException,但让NullPointerException消失不会让我感到震惊。
public class StringReverse
{
    public static String reverse(String s)
    {
        int i = s.length()-1;
        String letter = "";

        if(i == 0)
        {
            return""; //Base Case for the recusive method.
        }
        else
        {
            return letter = s.substring(s.length() - 1) + reverse(s.substring(s.length() - 1));
        }
    }

    public static void main(String[] args)
    {
        String input = "";
        Scanner in = new Scanner(System.in);

        do{
            System.out.println("\nEnter q to quit.");
            System.out.println("Enter a word...(No UpperCase letters)");
            input = in.nextLine();
            String reversedWord = reverse(input);
            System.out.print(reversedWord); 
        }while(!input.equals("q"));
    }   
}