2017-04-13 51 views
0
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 

为什么?

+0

最大值不是一个很好的名字,因为它并不表示它的实际用途。字符串的最大值可能是字符串中的'最高'字母,可能是字母表中最远的那个字母。 –

回答

4

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

  1. 您在打印索引0字符之前正在返回。
  2. 您只在调用下一个递归级别期间检索当前索引。意思是你的ch总是落后于索引。

也许这样做:

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); 
} 
+0

甚至可以重载最大值不接受一个长度参数,只是用字符串的长度调用最大值public static void maximum(String string){maximum(string.length() - 1); }' –

+0

感谢主席先生,这是非常好的建议 –

2

这是一个逻辑问题,而不是一个代码问题。首先,我建议在每次递归时打印出长度值。这将有希望揭示这个问题。你甚至可以手动做这件事,看看问题。

总体而言,您将不一致地处理变量length。在递归之前,您正确地减去1以获得最后一个字符的从零开始索引的位置。但是,在开始递归时,即使您从末尾检索到只有1个字符,您也会将length减少2。在那里,您将length的含义更改为表示最后一个位置,而不是其余字符串的长度。但在maximum()里面,你把它看作代码的一部分中的字符串长度,并且像另一部分中的最后一个位置。

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

+2

自从我开始写我的答案以来,其他人都以良好的编码建议做出了回应。我同意这个问题不需要递归,并且不能有效地进行设置。但是这是一个很简单的问题,重写代码无助于理解逻辑问题到底是什么,因此我强调了变量名称中的矛盾以及如何处理它。 –

相关问题