我正在使用递归函数(来自此处的一篇文章)来枚举从 n 中选择 k 项的所有组合。我已经修改了这个函数以保存并返回二维数组中的枚举组合(作为 arrPtr 传递给函数)。我在 for 循环(从 main)中为不同的 k 值(k 从 1 到 n-1)调用此递归函数,以生成 n 和 k 的任何值的所有组合。现在,将“count”定义为静态整数,该函数生成 k=1 的所有组合,然后转到 k=2,然后在某一点停止。原因是我使用变量“count”作为 arrPtr 中行的索引。由于它是一个静态变量,因此在其他轮次(k=2,3,4 等)调用该函数时它不会重置为 0。因此,在某个点之后会导致 arrPtr 的访问冲突。当我删除 'count' 的 'static' 时,它会生成不同 k 值的所有组合,但只有每轮中的最后一个组合保存在 arrPtr 中(同样由于删除了 'static')。如何将每个生成的组合保存在 arrPtr 中的一行中,以便我可以获取(并返回)保存在 arrPtr 最后指向的一个位置的所有组合?
我尝试使用按引用传递(传递变量的地址)将 arrPtr 中的行的索引传递给函数,但是当递归函数调用自身时会遇到麻烦。我搜索了很多,在这里找到了类似的主题(例如,从递归函数返回数组),但它们主要用于其他编程语言(我只使用 C;甚至没有 C++)。我花了很多时间来解决这个问题,现在真的需要帮助。先感谢您。
int** nCk(int n,int loopno,int ini,int *a,int **arrPtr, int k)
{
static int count=0;
int total; // equal to the total number of combinations of nCk
int i,j;
total = factorial(n)/(factorial(n-k)*factorial(k));
loopno--;
if(loopno<0)
{
a[k-1]=ini;
for(j=0;j<k;j++)
{
printf("%d,",a[j]);
arrPtr[count][j]=a[j];
}
printf("count =%d\n",count);
count++;
return 0;
}
for(i=ini;i<=n-loopno-1;i++)
{
a[k-1-loopno]=i+1;
nCk(n,loopno,i+1,a,arrPtr,k);
}
if(ini==0)
return arrPtr; // arrPtr is in fact an array of pointers, where each pointer points to an array of size k (one of the combinations of selecting k out of n elements
else
return 0;
}