假設我們有一個任意深度的整數陣列,我們將如何遍歷它以構建一個將陣串列示為 C 樣式初始化的字串?
例如:
int arr3D[2][3][2] = { {{0, 1}, {2, 3}, {4, 5}}, {{6, 7}, {8, 9}, {10, 11}} };
我們只知道:
- 值的總數(在本例中為 12)
- “維度”的數量(在本例中為 3)
- 每個維度索引(在本例中為 2、3、2)
- 價值
0,1,2,3,4,5,6,7,8,9,10,11
我們如何從中制作一個字串,看起來像這樣:
"{{{0,1},{2,3},{4,5}},{{6,7},{8,9},{10,11}}}"?
顯然,這可以通過嵌套的嵌套回圈來完成,但這只適用于一組確定的維度 (3)。如果我們有 10 個維度呢?這讓我覺得我可以使用遞回,但隨后何時以及如何放置{ }字符變得令人困惑。我目前正在考慮一個單一的線性掃描,它可以智能地在字串中插入{和}字符,0,1,2,3,4,5,6,7,8,9,10,11但我覺得現實世界的方法就像一個不確定的 n-tree 分支遍歷演算法。
uj5u.com熱心網友回復:
正如您所提到的,不需要 ndim for 回圈,您可以做的是使用 stride 之類的概念。就像那時你改變一個維度的數量,然后你可以建立你的字串。
因為您還沒有撰寫任何示例代碼來查看您在運行時感興趣的內容。我將撰寫一些偽代碼如何做到這一點。在最后一種情況下,應輸入尺寸并動態計算步幅。同樣最好在最后構建一個字串并列印,但僅出于演算法部分的目的,我只是逐個字符地使用 printf。
void print_mat(int* ptr, int ndims, int* dims){
int *stride = malloc(sizeof(int)* ndims);
// create stride array same size of dims
stride[ndims -1] = dims[ndims - 1];
for(int j = ndims - 2 ; j >= 0; j--)
stride[j] = dims[j] * stride[j 1];
// loop over all elements, stride[0] has the length
for(int idx = 0 ; idx < stride[0]; idx ){
// print open { for each start dimension
for(int i = 0; i < ndims; i )
if (idx % stride[i] == 0){printf("{");}
printf("%d", ptr[idx]);
// print close } for each end dimension
for(int i = 0; i < ndims; i )
if ((idx 1) % stride[ndims - i - 1] == 0){printf("}");}
printf(", "); // comma after each element
}
printf("\b\b \n"); // clear extra , at end (may not support in all terminals)
free(stride);
}
int main()
{
int arr3D[2][3][2] = { {{0, 1}, {2, 3}, {4, 5}}, {{6, 7}, {8, 9}, {10, 11}} };
int dims[3] = {2, 3, 2};
print_mat(&arr3D[0][0][0], 3, dims);
// same as
// print_mat((int *) arr3D, 3, dims);
return 0;
}
輸出:
{{{0, 1}, {2, 3}, {4, 5}}, {{6, 7}, {8, 9}, {10, 11}}}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/528338.html
標籤:数组C细绳递归多维数组
