3

再帰内での合計: 常に StackOverflow エラーが発生しますか?

public final static float getAlpha(int t, int i, int N, float[] P, float[][] B, float[][] A, int[] O)
{
    float alpha;
    if (t==1)
    {
        alpha = P[i] * B[i][O[0] - 1];
    }
    else
    {
        float sum = 0;
        int k;
        for (k=0; k < N; k++){
            sum = sum + (getAlpha(t-1, k, N, P, B, A, O) * A[k][i]);
        }
        alpha = sum * B[i][O[0] - 1];
    }
    return alpha;
}

次の行でエラーが発生します。

sum = sum + (getAlpha(t-1, k, N, P, B, A, O) * A[k][i]);

創造的な解決策はありますか?

4

3 に答える 3

0

明らかに、あなたの t は非常に大きいです (または間違いがあり、1 未満です)。

したがって、この関数を末尾再帰を持つように書き直すことができ (再帰がループで発生することを考えると難しい)、末尾再帰を実行する正しいタイプの JVM で実行していない限り (実際に実行できるのはごくわずかです)、再帰的なソリューション常にスタックをオーバーフローさせます。

この時点で、反復的に書き直すことをお勧めします。これはおそらく、ボトムアップから始めて、中間値を配列に格納することを意味します。

于 2013-05-10T23:21:23.933 に答える