1

各要素が前の要素に依存する配列のセットを構築していますが、初期値を設定するための洗練されたソリューションを思い付くのに苦労しています。コードは次のようになります。

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... */
}

ただし、もちろん、が0の場合、これは無効なメモリアクセスiです。すべての配列の初期値は0である必要があることを私は知っています。

この問題を解決する方法はいくつかあります。巨大なifステートメントをループに入れて、が0であるかどうかを確認できます。1回しiか評価されないため、不格好なようです。最後の反復の値を保持する、などtrueと呼ばれる配列ごとに、0に初期化された一時変数を保持できます。prev_val_of_Aすべての反復の終わりに、現在の値に更新する必要があります。ほとんどの場合、必要な値は配列の前の要素のすぐそこにあるため、これは少しばかげているように見えます。配列の意味をいじって、配列の2番目の要素にループの最初の反復の値が含まれるという規則を採用することができます。つまり、割り当てA[1025]、初期化A[0]してから、ループ内で実行します。

A[i+1] = A[i] + some_value();

これは紛らわしいようで、をさらに使用するとエラーが発生する可能性がありAます。

この問題を解決するためのクリーンでエレガントな提案を探しています。

4

3 に答える 3

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... */
}

編集: そして、これは数学を反映しているため、かなりエレガントです: シーケンスは、 n > 0f(0) = xの場合、によって定義されることがよくあります)f(n) = <stuff with f(n-1)>

于 2012-04-04T13:45:15.167 に答える
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... */
}
于 2012-04-04T13:46:04.850 に答える
0

概念的には、配列は初期値と再帰関係として定義されます。したがって、ループの外側で最初の要素を初期化してから、ループで次の値を計算します。なぜきれいにならないのかわかりません。

于 2012-04-04T13:46:19.057 に答える