【问题标题】:Dynamic Nested for loop using recursion (All Permutations)使用递归的动态嵌套 for 循环(所有排列)
【发布时间】:2015-11-26 01:38:37
【问题描述】:

我试图实现这样的东西。

我有一堆列表。

每个列表都有一定的数字。

A - 1,2,3    
B - 4,5    
C - 6,7,8    

我想找到 A、B、C 列表的所有排列 那就是:

1,4,6    
1,4,7    
1,4,8    
1,5,6    
1,5,7    
1,5,8    
2,4,6
and so on...

我可以使用 for 循环完成此操作,但列表的数量不是静态的。

所以我尝试使用递归。

这是我尝试过的: 调用:

nested(number_of_lists,0, array list of array, current_permutation);

以及功能:

static void nested(int depth, int index, ArrayList< ArrayList<Integer> > list, ArrayList<Integer> curr)
{

    if(depth==0)
    {


        ArrayList <Integer> x = new ArrayList<>();
        int i;
        for( i=0;i<curr.size();i++)
        {
            System.out.println(curr.get(i));

            x.add(curr.get(i));
        }
        global.add(x);

        curr.remove(curr.size()-1);

    }
    else
    {

        for(int i=0;i<list.get(index).size();i++)
        {

            curr.add(list.get(index).get(i));

            nested(depth-1, index+1, list, curr);

            if( curr.size()==list.get(index).size())
            {
                curr.remove(curr.size()-1);
            }

            if(index==0 &&(curr.size()-1) == i)
                curr = new ArrayList<>();


        }
    }

}

全局是存储了所有排列的数组列表的新数组列表。

但是,在用 A 进行两次排列后,我得到了错误的答案

1 4 6 
1 4 7 
1 4 8 
1 5 6 
1 5 7 
1 5 8 
2 4 6 
2 4 7 
2 4 8 
2 5 6 
2 5 7 
2 5 8 
2 3 4 6 
2 3 7 
2 3 8 
2 5 6 
2 5 7 

等等..

代码哪里出错了。 我的前两个 A 的两个元素的排列非常好。 抱歉这么长的解释。 一些帮助将不胜感激。

【问题讨论】:

    标签: java algorithm recursion permutation


    【解决方案1】:

    您似乎使这比实际情况更复杂。我已经设法通过注释掉你的一些行来纠正这个问题。

    static void nested(int depth, int index, ArrayList< ArrayList<Integer> > list, ArrayList<Integer> curr)
    {
    
        if(depth==0)
        {
    
    
            ArrayList <Integer> x = new ArrayList<>();
            int i;
            for( i=0;i<curr.size();i++)
            {
                System.out.println(curr.get(i));
    
                x.add(curr.get(i));
            }
            global.add(x);
    
            //curr.remove(curr.size()-1);
    
        }
        else
        {
    
            for(int i=0;i<list.get(index).size();i++)
            {
    
                curr.add(list.get(index).get(i));
    
                nested(depth-1, index+1, list, curr);
    
                //if (curr.size()==list.get(index).size())
                //{
                    curr.remove(curr.size()-1);
                //}
    
                //if(index==0 &&(curr.size()-1) == i)
                //    curr = new ArrayList<>();
    
    
            }
        }
    
    }
    

    【讨论】:

    • 非常感谢。还有其他方法吗,或者这是最好的方法吗?
    • 您可以进行一些改进。例如,您不需要indexdepth,因为它们的总和总是list.size()。此外,涉及x 的整个部分都可以替换为global.add(new ArrayList&lt;&gt;(curr));。最后,尽量避免全局变量。相反,只需将global 作为参数添加到方法中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 2015-12-28
    相关资源
    最近更新 更多