以下代码段将打印数组元素的每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
答案 0 :(得分:3)
你的函数的递归版本可以这样工作:
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个字符的空终止数组,保持递归并构建要在最后一级打印的字符串。然后我是循环的起始位置,k是递归的当前级别。
你会这样称呼:
recur (arr, -1, len, out, 0, 4 );
<强> Online demo 强>
答案 1 :(得分:2)
没有递归,你可以使用它(len =数组的长度):
int i, j, w, x;
for(i=0; i<pow(len,len); i++){ //n^n possibilities / combinaisons
w = i;
for(j=0; j<len; j++){ //Show the combinaison
x = w%len; //We have juste to calculate the correct position with some modulos
printf("%c", array[x]);
w = w/len;
}
printf("\n");
}
例如:
#include <stdio.h>
#include <math.h>
int main(){
int array[] = {1,2,3};
int len = 3;
int i, j, w, x;
for(i=0; i<pow(len,len); i++){
w = i;
for(j=0; j<len; j++){
x = w%len;
printf("%d", array[x]);
w = w/len;
}
printf("\n%d\n", i);
}
}
你应该:
111
211
311
121
221 [...]
133
233
333
答案 2 :(得分:0)
嗯,而不是N循环 - 你只需要一个。在这个主循环中,你必须只有两个内部循环来增加索引数组和打印值:
int index[N] = {};
do
{
// print
for (int i = 0; i < N; ++i)
printf("%c", arr[index[i]]);
printf("\n");
} while (increment(index, N, len));
所以 - 主循环:
DoWorkEventArgs