Как сделать n вложенным для цикла в C или Objective C - PullRequest
3 голосов
/ 02 января 2011

Как сделать что-то подобное

for(int a = 0; a<2; a++){
        for(int b = 0; b<2; b++){
            for(int c = 0; c<2; c++){
                for(int d = 0; d<2; d++){

                    n[a+b+c+d]=x[a]*y[b]*z[c]...
}}}}

Но у меня есть x [n] ...

Ответы [ 3 ]

3 голосов
/ 02 января 2011

Рекурсивно:

void do_sum(double *n, double *x, int limit, int index, double sum)
{
    if (limit == 0)
        n[index] = sum;
    else
        for (int a = 0; a<2; a++)
            do_sum(n, x, limit-1, index+a, sum+x[a]);
}

Чтобы начать рекурсию, начните с do_sum(n, x, max_n, 0, 0)

0 голосов
/ 02 января 2011

На самом деле глубина для них составляет всего 2 для каждого измерения, т. Е. 2 ​​* N общей вероятности.Что-то странное, что он будет обращаться к одному и тому же элементу в n [] для разных значений, перезаписывая вещи:

a = 0, b = 1, c = 0, d = 1 a = 1, b =1, c = 0, d = 0 ...

n [a + b + c + d] фактически просто индексирует в n [2] для C (4,2) и т. Д. Я думаю, что фактическоевопрос должен быть помечен и переосмыслен.

Это не похоже на продуманный вопрос.

Но если что-нибудь - я бы пошел с методом обратного отслеживания (рекурсия), если этодействительно то, что хочет пользователь.(особенно если есть N измерений - так как нет действительно отличного способа сделать это итеративно, если только вы не захотите применить к нему dp, что, вероятно, над головой конечного пользователя)

0 голосов
/ 02 января 2011

@ jbx прав: рекурсивный путь. Предполагая, что n[] и x[] являются глобальными:

void
work(int depth, int n_index, int x_total)
{
    if (depth == 0) {
        n[n_index] = x_total;
    }
    else {
        for (int i = 0; i < 2; i++) {
            work(depth-1, n_index+i, x_total+x[i]);
        }
    }
}

void
do_multidimensional_thing(int depth)
{
    work(depth, 0, 0);
}
...