Java中的按引用传递行为递归:字符串的组合和排列

Java中的按引用传递行为递归:字符串的组合和排列,java,recursion,pass-by-reference,combinations,permutation,Java,Recursion,Pass By Reference,Combinations,Permutation,我一直在用java编写一个递归函数,以输出不允许重复的字符串的所有组合(“c”字母输出所有选择“e”字母的组合)。在数组和向量返回到递归调用之前的状态时,我遇到了麻烦。几乎所有的事情都是通过引用传递的(这可能是发生了什么:我不知道如何通过它,我更习惯于用C++编程而不是java)。 以下是我的Java代码: void calcCombNoRep(Vector c, String[] e){ if(isFull(e)){ output(e); return;

我一直在用java编写一个递归函数,以输出不允许重复的字符串的所有组合(“c”字母输出所有选择“e”字母的组合)。在数组和向量返回到递归调用之前的状态时,我遇到了麻烦。几乎所有的事情都是通过引用传递的(这可能是发生了什么:我不知道如何通过它,我更习惯于用C++编程而不是java)。 以下是我的Java代码:

void calcCombNoRep(Vector c, String[] e){
    if(isFull(e)){
        output(e);
        return;          
    }
    for (int i = 0; i < c.capacity(); ++i){
        e[getNextInd(e)] = (String)c.remove(i);
        calcCombNoRep(c,e);
    }
}
void calcCombNoRep(向量c,字符串[]e){
如果(已满(e)){
产出(e);
返回;
}
对于(int i=0;i
下面是它在调试窗口中的工作方式(所有调用的函数,如output()等,似乎都可以正常工作):

初始调用:c=[abcdd];e=[[uuu]

递归调用1:c=[bcd];e=[a u2;]

递归调用2:c=[cd];e=[AB]

返回

返回后:c=[cd];e=[AB]

然后我们在数组中得到一个冲突,因为我试图在数组中的索引1处放置一个值,其中b是

它在我心目中的作用:

初始调用:c=[abcdd];e=[[uuu]

递归调用1:c=[bcd];e=[a u2;]

递归调用2:c=[cd];e=[AB]

返回

返回后:c=;e=[a u2;]

然后我应该能够在数组的索引1处放置一个值,因为数组已经从递归调用2后的状态返回到递归调用1后的前一个状态


我不确定我的算法是否正确;我还没能通过递归问题找到答案。

那里似乎至少有两个问题

首先,您将按索引从
向量中删除项。因此,如果我们从一个包含
a,b,c,d,e,f
的向量开始,循环的每次迭代都会给出:

`b, c, d, e, f` // remove(0)
`b, d, e, f` // remove(1)
`b, d, f` // remove(2)
!!! // remove(3)
其次,Java按值传递引用。没有深度复制。您可以为每个元素复制
向量
,也可以为每个迭代更有效地修复:

    String str = (String)c.remove(i);
    e[getNextInd(e)] = str;
    calcCombNoRep(c,e);
    c.add(str, i);
(我还应该指出,自1998年以来,使用了
List
(带有
ArrayList
实现)代替
Vector
,自2004年以来,我们使用了泛型(
List