gpt4 book ai didi

Java递归返回一个字符串

转载 作者:行者123 更新时间:2023-12-05 01:08:56 25 4
gpt4 key购买 nike

public  String starString(int n){               
int m = (int)Math.pow(2,n);
String str="";
str = starString(m-1,str);
return str;
}
private String starString(int n, String str){
String temp ="";
if (n<0) {
try{
throw new IllegalArgumentException();
}
catch(IllegalArgumentException ex){
}
}
else {
temp+=("*");
starString(n-1,str);
}
return temp;
}

有人可以向我解释为什么即使调用的值大于 n >= 0,这段代码也会返回一个星号吗? ?

我调试并注意到在抛出异常后它再次递归并且所有星号都被截断为“”。我试过很多次了。它还要求您应该抛出 IllegalArgumentException如果n < 0 .

最佳答案

在 Java 中,字符串是免疫的,因此您需要为 temp 分配一个新值(并将 temp 作为参数传递):

temp = starString(n-1, temp);        

此外,您需要将 str 分配给 temp,否则每次递归只会返回一个星号:

String temp = str;

递归方法的更简单、更清晰(和正确)的版本如下所示:

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;
}

请注意,您甚至不需要将字符串作为参数传递。另请注意,递归在这里有点矫枉过正,使用循环将毫无意义。另请注意,字符串连接的成本很高,并且对于较高的 n 值会很快变慢(由于一遍又一遍地创建不可变字符串实例)。在那种情况下,您最好使用 StringBuilder:

private  String starString(int n){          
StringBuilder s = new StringBuilder();
for( int i = 0; i <= n; i++ ) {
s.append("*");
}
return s.toString();
}

在我的机器上,使用字符串连接的循环版本对于 n = 100000 大约需要 12 秒,而 StringBuilder 版本需要 0.007 秒。

关于Java递归返回一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10540726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com