反向字符串递归方法

时间:2011-06-06 05:28:35

标签: java recursion reverse

您好 为什么我使用递归的反向方法不起作用? 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;
    }

}

有什么建议吗?

4 个答案:

答案 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个字符的输入字符串