使用递归反转字符串,但为什么不打印整个字符串?

时间:2017-04-13 19:12:10

标签: java recursion

public static void main(String[] args)
{
    String string="HelloWorld";
    char ch = string.charAt(string.length()-1);
    maximum(string,ch,string.length()-2);
}

public static void maximum(String string,char ch,int length)
{
    if(length==0)
        return;
    System.out.println(ch);
    maximum(string,string.charAt(length),length-1);
}

打印

d
l
r
o
w
o
l
l

而不是

d
l
r
o
w
o
l
l
e
h

为什么?

2 个答案:

答案 0 :(得分:4)

这里做递归不是你应该做的事情。但是,假设这是一个学习练习,我在这里看到两个问题:

  1. 在打印索引0字符之前返回。
  2. 您只在调用下一个递归级别时检索当前索引。这意味着您的ch总是落后于索引。
  3. 可能会做类似的事情:

    public static void main(String[] args)
    {
        String string="HelloWorld";
        maximum(string, string.length()-1);
    }
    
    public static void maximum(String string, int length)
    {
        System.out.println(string.charAt(length))
        if(length==0)
            return;
        maximum(string, length-1);
    }
    

答案 1 :(得分:2)

这是一个逻辑问题,而不是代码问题。首先,我建议在每次递归时打印出长度值。这将有希望揭示问题。您甚至可以手动执行此操作并查看问题。

总的来说,您对变量length的处理方式不一致。在递归之前,您正确地减去1以获得最后一个字符的从零开始的索引位置。但是,当你开始递归时,你将length减少2,即使你从末尾只检索了1个字符。在那里,您将length的含义更改为意味着最后一个位置而不是剩余字符串的长度。但是在maximum()里面,你把它当作代码的一部分中的字符串长度,就像另一部分中的最后一个位置一样。

无论哪种方式,您都需要更改maximum()中的代码以一致地处理变量。根据您选择的含义,您可能需要将最初发送的参数值更改为maximum()