我正在构建一组数组,其中每个元素都依赖于前一个元素,而我很难想出一个优雅的解决方案来设置初始值。代码看起来像这样:
int A[1024];
int B[1024];
/* ... more arrays... */
int i;
for (i = 0; i < 1024; i++) {
/* do some work */
A[i] = A[i-1] + some_value();
B[i] = B[i-1] + some_other_value();
/* ... and so on... */
}
但当i
为0时,这当然是无效的内存访问。我知道所有数组的初始值都应为0.
有几种方法可以解决这个问题。我可以在循环中放置一个巨大的if
语句来检查i
是否为0.看起来很笨,因为它只会评估true
一次。我可以为每个数组保存一个临时变量,初始化为0,称为prev_val_of_A
等,它保存最后一次迭代的值。我必须在每次迭代结束时将其更新为当前值。这似乎有点傻,因为大多数时候,我想要的值就是坐在数组的前一个元素中。我可以弄清楚数组的含义,并采用这样的约定,即数组中的 second 元素包含循环的第一次迭代的值;也就是说,为A[1025]
分配,初始化A[0]
,然后在循环中执行
A[i+1] = A[i] + some_value();
这似乎令人困惑,可能会在进一步使用A
时遇到错误。
我正在寻找干净,优雅的建议来解决这个问题。
答案 0 :(得分:2)
解决此问题的最简单方法是初始化A[0]
,B[0]
等,然后从i = 1
开始循环。即
int A[1024];
int B[1024];
/* ... more arrays... */
int i;
A[0] = stuff();
B[0] = other_stuff();
/* etc */
for (i = 1; i < 1024; i++) {
/* do some work */
A[i] = A[i-1] + some_value();
B[i] = B[i-1] + some_other_value();
/* ... and so on... */
}
编辑:这是相当优雅的,因为它反映了数学:序列通常由f(0) = x
定义,f(n) = <stuff with f(n-1)>
如果n&gt; 0)
答案 1 :(得分:0)
以下内容如何:
int AX[1024+1];
int BX[1024+1];
int *A = AX+1, *B = BX+1;
AX[0] = 0;
BX[0] = 0;
/* ... more arrays... */
int i;
for (i = 0; i < 1024; i++) {
/* do some work */
A[i] = A[i-1] + some_value();
B[i] = B[i-1] + some_other_value();
/* ... and so on... */
}
答案 2 :(得分:0)
从概念上讲,您的数组被定义为初始值和reccurence关系。因此,只需在循环外初始化第一个元素,然后使用循环计算下一个值。我不明白为什么它不漂亮。