您好 为什么我使用递归的反向方法不起作用? print语句显示操作已正确完成,但最后似乎只将整个String的非常字符分配给h。
public static String reverse(String s,String h){
if(s.length()==0){
return s;
} else {
h+=s.charAt(s.length()-1);
System.out.println(h);//FOR TEST
s=s.substring(0,s.length()-1);
reverse(s,h);
return h;
}
}
有什么建议吗?
答案 0 :(得分:5)
使用
return reverse(s,h);
而不是
返回h;
即:
public static String reverse(String s,String h){
if(s.length() == 0){
return h;
} else {
h+=s.charAt(s.length()-1);
System.out.println(h);//FOR TEST
s=s.substring(0,s.length()-1);
return reverse(s,h); //NOTICE THE CHANGE HERE,
}
}
答案 1 :(得分:4)
Java中的字符串是不可变的。所以在这段代码中:
private static void foo(String x) {
x += "bar";
}
public static void main() {
String a = "foo";
foo(a);
System.out.println(a);
}
仅打印"foo"
。它的工作方式与int
类型相同。
因此,您的reverse
函数需要对返回值执行某些操作。当您调用reverse(s,h)
时,您将丢弃递归调用的返回值。你需要加入它:
String rec = reverse(s,h);
return ... something involving rec ...;
答案 2 :(得分:1)
2件事:
public static String reverse(String s,String h){
if(s.length()==0){
return h; /// This needs to return the reversed string (h).
} else {
h+=s.charAt(s.length()-1);
System.out.println(h);//FOR TEST
s=s.substring(0,s.length()-1);
h = reverse(s,h); /// You need to use the return value
return h;
}
}
看起来您正在尝试使用return-by-reference-parameter更改h。您必须记住,在Java中,所有内容(包括对对象的引用)都是按值传递的。写入s=s.substring(0,s.length()-1);
后,s
将成为对不同String
对象的引用,并且该更改不会传播到调用函数。
此外,还有一种方法可以只使用一个输入参数来实现它。
答案 3 :(得分:1)
我认为这种方式更适合使用递归方法反转字符串:
public class Reversestringbyrecursivefunction {
public static void main(String[] args)
{
Scanner input=new Scanner(System.in);
while(true)
{
System.out.print("[?] Enter String('q' for exit)> ");
String str=input.next();
if(str.equals("q"))
break;
System.out.println("this string created by reversed recursive function : "+revers(str));
System.out.print("\n==========================\n");
}
System.out.print("\n\n\t\t\t[ GOOD LUCK!!! ]\n");
}
static String revers(String str)
{
if(str.length()<=1)
return str;
else
return revers(str.substring(str.length()-1, str.length()))+revers(str.substring(0, str.length()-1));
}
}
但是,为了获得最佳性能,您应该更改此行:
return revers(str.substring(str.length()-1, str.length()))+revers(str.substring(0, str.length()-1));
到:
return str.substring(str.length()-1)+revers(str.substring(1, str.length()-1)+str.substring(0,1);
在前一行中:在最佳性能和一个阶段中,您只能交换输入字符串的1个字符。但是,在新行中:在一个阶段中,您可以交换2个字符的输入字符串