无限延长内部for循环调用

时间:2016-06-17 20:11:08

标签: c for-loop recursion

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

3 个答案:

答案 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
        }
    }
}

在此递归中,arrlen对应于您的定义,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