反向字符串递归方法

发布于 2024-11-13 22:16:48 字数 391 浏览 8 评论 0原文

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

}

有什么建议吗?

Hello
Why my reverse method that uses recursion isn't working?
The print statement shows that the operation is done correctly but at the end it seems like only the very ast char of the entire String is assigned to 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;
    }

}

Any advice?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

篱下浅笙歌 2024-11-20 22:16:48

使用

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

}

Use

 return reverse(s,h); 

instead of
return h;

i.e:

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

}
乖乖兔^ω^ 2024-11-20 22:16:48

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

Strings in Java are immutable. So in this code:

private static void foo(String x) {
    x += "bar";
}

public static void main() {
    String a = "foo";
    foo(a);
    System.out.println(a);
}

Only "foo" will be printed. It works the same way as if the type were int.

So your reverse function needs to do something with the return value. When you call reverse(s,h) you are throwing away the return value from the recursive call. You need to incorporate it:

String rec = reverse(s,h);
return ... something involving rec ...;
江心雾 2024-11-20 22:16:48

两件事:

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

}

看起来您正在尝试使用按引用返回参数来更改 h 。您必须记住,在 Java 中,所有内容(包括对对象的引用)都是按值传递的。一旦您编写 s=s.substring(0,s.length()-1);s 就会成为对不同 String 的引用对象,并且该更改不会传播到调用函数。

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

2 things:

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

}

It looks like you were trying to change h using a return-by-reference-parameter. You have to remember that in Java everything (including references to objects) is passed by value. Once you write s=s.substring(0,s.length()-1);, s becomes a reference to a different String object, and that change is not propagated to the calling function.

Also, there is a way to implement this with only one input parameter.

相权↑美人 2024-11-20 22:16:48

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

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

I think this way is better for reversing a string using a recursive method :

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

but , for best performance you should change this line :

return revers(str.substring(str.length()-1, str.length()))+revers(str.substring(0, str.length()-1));

to :

return str.substring(str.length()-1)+revers(str.substring(1, str.length()-1)+str.substring(0,1);

in prior line: in best performance and in one stage you can swap only 1 character of input string . but , in new line: in one stage you can swap 2 character of input string

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文