java 递归问题

发布于 2022-09-01 23:52:27 字数 1225 浏览 10 评论 0

数据结构与算法分析的课后习题
编写带有下列声明的例程:
public void permute( String str );
private void permute( char [] str, int low, int high );
第一个例程是驱动程序,它调用第二个例程并显示String str中的字符的所有排列。如果str是"abc",那么输出的串则是abc,acb,bac,bca,cab和cba。第二个例程使用递归。

答案如下:

public class Permute
{

public void permute ( String str )
{
    permute (str.toCharArray (), 0, str.length ());
    String tmp = new StringBuilder ().append (str).reverse ().toString ();
    permute (tmp.toCharArray (), 0, tmp.length ());
}

private void permute ( char[] str, int low, int high )
{
    if (low == high)
    {
        return;
    }
    String result = "";
    for ( int i = low; i < high; i++ )
    {
        result += str[i];
    }
    if (result.length () < str.length)
    {
        int count = str.length - result.length ();
        for ( int i = 0; i < count; i++ )
        {
            result += str[i];
        }
    }
    System.out.println (result);
    permute (str, ++low, high);
}

public static void main ( String[] args )
{
    Permute permute = new Permute ();
    permute.permute ("abc");
}

}

上面的代码,虽然也是方法自己调用自身,但感觉permute (str, ++low, high);这样的调用其实用for循环就能写出来,这个应该不能算是递归吧,
求更好的递归解法

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

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

发布评论

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

评论(3

轮廓§ 2022-09-08 23:52:27
  1. 为什么不能算递归,尾递归就不是递归了?

  2. 递归和循环等价

参考1: https://www.zhihu.com/question/20418254
参考2: https://www.zhihu.com/question/29373492

魂归处 2022-09-08 23:52:27

递归和循环本质是都是多次执行,是可以互相替代的,只是递归是另外一种思想,你的代码是递归
但是,你的代码没办法完成的题目中说的结果,递归思想有问题,没有得出全部结果,一个长度为n的个字符不重复的字符串有n!种排列这个应该都知道吧,你可以执行adcd是无法出来24种结果的。下面是我刚才写的一个递归,没仔细查,可能有不对的,map主要是用来去重的

public static void main (String[] args){
        String a = "abcd";
        test t = new test();
        t.permute(a);
    }
    public void permute ( String str )
    {
        Map<String,String> m = newPermute(str.substring(1),str.toCharArray()[0]+"");
        for (Map.Entry<String, String> entry : m.entrySet()) {
            System.out.println(entry.getKey().toString());
        }
    }


    private Map<String,String> newPermute(String string,String a){
        Map<String,String> map = new HashMap<String,String>();
        char[] str = string.toCharArray();
        if(str.length==1){
            map.put(str[0]+a,str[0]+a);
            map.put(a+str[0],a+str[0]);
            return map;
        }else{
            Map<String,String> m = newPermute(string.substring(1),str[0]+"");
            for (Map.Entry<String, String> entry : m.entrySet()) {
                String key = entry.getKey().toString();
                map.put(a+key,a+key);
                map.put(key+a,key+a);
                for(int i = 1;i < key.toCharArray().length;i++){
                    String newKey = key.substring(0,i)+a+key.substring(i);
                    map.put(newKey,newKey);
                }
            }
        }
        return map;
    }
Bonjour°[大白 2022-09-08 23:52:27

改为迭代试试,java的递归默认好像就2万多次

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