下面的代码片段将打印数组元素的每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
        }
    }
}

在这个递归中,arrlen对应于您的定义,n是您想要实现的循环的深度(在您的非递归版本中是4)。
诀窍是使用一个以空结尾的n+1个字符的数组,该数组在递归中保留,并构建要在最后一级打印的字符串。然后i是循环的起始位置,k是当前递归级别。
你可以称之为:
recur (arr, -1, len, out, 0, 4 );

Online demo

07-24 09:50
查看更多