返回字符串的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递归 公共字符串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

我调试并注意到,在抛出异常后,它再次递归,所有星号都被切碎为“”。我已经尝试了很多次。如果Java字符串中的
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();
}