返回字符串的Java递归 公共字符串starString(int n){ int m=(int)Math.pow(2,n); 字符串str=“”; str=星串(m-1,str); 返回str; } 私有字符串starString(int n,String str){ 字符串temp=“”; 如果(n=0
我调试并注意到,在抛出异常后,它再次递归,所有星号都被切碎为“”。我已经尝试了很多次。如果Java字符串中的返回字符串的Java递归 公共字符串starString(int n){ int m=(int)Math.pow(2,n); 字符串str=“”; str=星串(m-1,str); 返回str; } 私有字符串starString(int n,String str){ 字符串temp=“”; 如果(n=0,java,Java,我调试并注意到,在抛出异常后,它再次递归,所有星号都被切碎为“”。我已经尝试了很多次。如果Java字符串中的n
n<0
是不可变的,则还需要抛出IllegalArgumentException
,因此需要为temp
分配一个新值(并将temp
作为参数传递):
此外,您需要将str
分配给temp
,否则每个递归只返回一个星号:
temp = starString(n-1, temp);
递归方法的更简单、更清晰(正确)的版本如下所示:
String temp = str;
请注意,您甚至不需要将字符串作为参数传递。还请注意,这里的递归过于死板,使用循环将毫无意义。还请注意,字符串串联代价高昂,并且对于较高的n
(由于反复创建不可变的字符串实例)会很快变慢.在这种情况下,您最好使用StringBuilder
:
private String starString(int n){
String temp = "*";
//only recurse as long as n > 0, i.e. the last invocation would be made with n = 0
if (n > 0){
temp += starString(n-1);
}
return temp;
}
私有字符串starString(int n){
StringBuilder s=新的StringBuilder();
对于(int i=0;i您的代码调用每个递归,存储一个本地temp
,返回这个值,但它从未被使用过。为什么这个问题被否决了?是的,这可能会更好,但对于仍在学习Java编码的人来说,这是一个合理的问题。不要在预期的条件下使用异常;异常是用于异常的所有发生,而不是作为递归结束的信号。这个异常是什么意思?你把它扔到try
-块中,因此它会立即被捕获。谢谢…但我通过递归季度获得了它。所以循环迭代是不可能的。
private String starString(int n){
String temp = "*";
//only recurse as long as n > 0, i.e. the last invocation would be made with n = 0
if (n > 0){
temp += starString(n-1);
}
return temp;
}
private String starString(int n){
StringBuilder s = new StringBuilder();
for( int i = 0; i <= n; i++ ) {
s.append("*");
}
return s.toString();
}