我一直在研究java中的递归函数来输出不允许重复的字符串的所有组合('c'letter输出所有选择'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);
}
}
以下是它在调试窗口中的工作方式(所有调用的函数,如 output() 等似乎都可以正常工作):
初始调用:c = [abcd]; e = [ _ _ ]
递归调用 1:c = [bcd]; e = [一个_]
递归调用 2:c = [cd]; e = [ab]
返回
返回后:c = [cd]; e = [ab]
然后我们在数组中遇到冲突,因为我试图在数组中 b 所在的索引 1 处放置一个值。
它应该如何在我的脑海中发挥作用:
初始调用:c = [abcd]; e = [ _ _ ]
递归调用 1:c = [bcd]; e = [一个_]
递归调用 2:c = [cd]; e = [ab]
返回
返回后:c = ; e = [一个_]
然后我应该能够在数组中的索引 1 处放置一个值,因为数组已经从递归调用 2 之后的状态返回到递归调用 1 之后的先前状态。
我不确定我的算法是否正确;我无法通过递归问题找出答案。