下面的代码片段将打印数组元素的每4个字符长的组合(不重复)。
for (int i = 0; i < len; i++)
for (int j = i + 1; j < len; j++)
for (int k = j + 1; k < len; k++)
for (int l = k + 1; l < len; l++)
printf("%c%c%c%c\n", arr[i], arr[j], arr[k], arr[l]);
我的问题是我不知道如何将其扩展到一般函数(即每n个字符长的组合打印一次)。我怎么能让一个函数做同样的事情,但是被这样调用:
combinationPrint(array, numberOfForLoops); // With other params if needed
最佳答案
函数的递归版本的工作方式如下:
void recur (char* arr, int i, int len, char *x, int k, int n) {
if (k==n) { // the last inner loop
x[k]=0;
printf ("%s\n", x);
}
else {
for (int j=i+1; j<len; j++) { // recursive loop
x[k]=arr[j];
recur (arr, j, len, x, k+1, n); // call recursion for an inner loop
}
}
}
在这个递归中,
arr
和len
对应于您的定义,n是您想要实现的循环的深度(在您的非递归版本中是4)。诀窍是使用一个以空结尾的n+1个字符的数组,该数组在递归中保留,并构建要在最后一级打印的字符串。然后i是循环的起始位置,k是当前递归级别。
你可以称之为:
recur (arr, -1, len, out, 0, 4 );
Online demo