繁体   English   中英

反向字符串递归方法

[英]reverse string recursive method

您好为什么我使用递归的反向方法不起作用? print 语句显示操作已正确完成,但最后似乎只有整个 String 的 ast char 被分配给 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;
    }

}

有什么建议吗?

利用

 return reverse(s,h); 

而不是返回 h;

IE:

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

}

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 function 需要对返回值做一些事情。 当您调用reverse(s,h)时,您将丢弃递归调用的返回值。 你需要合并它:

String rec = reverse(s,h);
return ... something involving rec ...;

我认为这种方式更适合使用递归方法来反转字符串:

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 个字符

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 object 的引用,并且该更改不会传播到调用 function。

此外,还有一种方法可以仅使用一个输入参数来实现这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM