0

我将如何实现一个函数,其参数在循环中发生变化?

即我希望能够以以下形式实现该功能:

f( A[0], A[1], A[2] );
f( A[2], A[0], A[1] );
f( A[1], A[2], A[0] );
f( A[0], A[1], A[2] );
f( A[2], A[0], A[1] );
f( A[1], A[2], A[0] );

我尽可能使用下面的程序在正确的位置创建数字,使用 printf() 函数进行测试:

#include <stdio.h>

int main()
{
    int i, j, k, l;

    for(i = 0; i < 2; i++)
    {
        for( j = 0; j < 3; j++ )
        {
            for( k = 0; k < 3; k++ )
            {
                l = k - j;
                if( l < 0)
                    l += 3;
                printf("%d", l);
            }
            printf("\n");
        }
    }
}
4

4 回答 4

3

如果我正确理解您的问题,您所需要的只是:

int i;
for (i = 0; i < NUM_CALLS; i++)
    f(A[(2 * i) % 3], A[(2 * i + 1) % 3], A[(2 * i + 2) % 3])  
于 2013-04-29T16:15:26.493 回答
0

你所缺少的只是f( A[i], A[j], A[k] );最内层的循环。

于 2013-04-29T16:05:06.503 回答
0

在给出的示例中,您似乎希望遍历 A[0]、A[1] 和 A[2] 的三 (3) 个排列。

最简单的方法,可能不是你想要的,是做......

for (i = 0; i < NUM_ITERATIONS; i++)
    {
    f (A[0], A[1], A[2]);
    f (A[2], A[0], A[1]);
    f (A[1], A[2], A[0]);
    }

其他人,我相信已经列出了一个使用模运算符'%'的算法,所以我将跳过它。您可能还希望使用预定义的数组。考虑 ...

ArgumentArray[6] = {A[0], A[1], A[2], A[0], A[1]};

for (i = 0; i < NUM_ITERATIONS; i++)
    {
    for (j = 0; j < 3; j++)
        {
        f (ArgumentArray[j], ArgumentArray[j+1], ArgumentArray[j+2]);
        }
    }

诚然,上面的内容与您在问题中发布的调用 f() 的顺序不同,但它可能有助于为您提供有关您希望以哪种方式进行的新想法。

希望这可以帮助。

于 2013-04-29T16:25:49.303 回答
0

我可以说索引每次都向右循环移动。所以在我可以给你建议之后

void indices_circular_right_shift(int *indices) {
    // The indices are circular rught shifted
    int k = indices[2];
    indices[2] = indices[1];
    indices[1] = indices[0];
    indices[0] = k;
}

int main (int argc, char *argv[]){

    int indices[3] = {0, 1, 2};
    int i = 0;
    for (i=0; i<6; i++) {
        f(A[indices[0]], A[indices[1]], A[indices[2]]);
        indices_circular_right_shift(indices);
    }

}
于 2013-04-29T17:06:16.563 回答