У меня возникли проблемы с выяснением того, как создать декартово произведение массива с зубцами. У меня есть googled вокруг, но я наклоняю, кажется, ищут имплантацию для итеративного языка. Поэтому я пытаюсь понять это сам, но я попал в ловушку. Позволяет определить проблему немного яснееКак сгенерировать декартово произведение зубчатого массива?
Скажем у меня есть массив массивов, который выглядит как этот
A = { {1}, {2, 3}, {4, 5, 6} }
как я иду от того, к
B = { {1, 2, 4}, {1, 2, 5}, {1, 2, 6}, {1, 3, 4}, {1, 3, 5}, {1, 3, 6} }
редактирования: Теперь это просто Например, первый массив может содержать динамическое количество массивов, и каждый массив имеет динамический размер.
Если x - количество элементов во внешнем массиве, а y [] - динамический массив длины x, элементы, содержащие количество элементов во внутреннем массиве. Тогда x of A становится y of B, а x of B является мультипликативной суммой y в A. (не доказано, взято из примеров)
Поскольку x of A является динамическим, функция должна быть рекурсивный. Вот моя попытка.
int** cartesian (int** A, int x, int* y, int* newx, int* newy) {
*newy = x;
*newx = 1;
for (int i = 0; i < x; i++)
*newx *= y[i];
int** B = malloc(sizeof(int) * *newx * *newy);
int xi = 0;
int* tmp_prod = malloc(sizeof(int) * x);
recurse(x, 0, y, A, &xi, tmp_prod, B);
free(tmp_prod);
return B;
}
void recurse(int x, int xi, int* y, int** A, int* newx, int* temp_inner, int** B) {
if (xi < x) {
for (int i = 0; i < y[xi]; i++) {
temp_inner[xi] = A[xi][i];
recurse(x, xi + 1, y, A, newx, temp_inner, B);
}
} else {
for (int i = 0; i < x; i++) {
B[*newx][i] = temp_inner[i];
}
(*newx)++;
}
}
Это, насколько я получил. Рекурсивная функция создает временный массив из одного элемента [глубины рекурсии], а затем, когда он в maxdepth, он присваивает это B и увеличивает итератор Bs, возвращает назад и выбирает следующий элемент [depth рекурсии], et с.
Проблема в том, что segfaults и я не могу понять почему.
Я думаю, вы хотите, чтобы вы хотели: «B = {{1, 2, 4}, {1, 2, 5}, {1, 2, 6}, {1, 3, 4}, {1, 3, 5}, {1, 3, 6}} '(Обратите внимание на изменение среднего элемента в последних двух кортежах.) – Arun
О, да. Конечно. Я изменил его в сообщении. Благодаря! – solenskiner
, откуда у вас возникла эта проблема? –