4

これは過去の試験問題からの問題です。

i<=nループ テストで と表示されているのに、なぜループ不変条件が表示されるのですかi<n

適切な答えは次のとおりです。while ループの失敗条件でi<=nas iwill equals と表示されます。nしたがって、 の 6 回目の繰り返しは、失敗した状態でiは値 6 に等しくなります。nただし、while ループ自体はi<ni0 から開始しi、5 に等しい 1 回ループを終了すると述べています。

private int n =6;

public int fact(){
    int i = 0;
    int f = 1;

    /**loop invariant
     * 0<=i<=n
     * f=i!
     */
    while(i<n){//loop test
        i=i+1;
        f=f*i;
    }

    return f;
}
4

3 に答える 3

1

ループが終了したときだPost-Conditionからです。ループに入るときは. ループ内では に向かってカウントアップしています。したがって、不変式はです。i==nPre-Conditioni==0in0 <= i <= n

説明では不変部分を省略しfました。不変式はループの正しさと意味を捉える必要があるため、これは実際には十分ではありません。

private int n = 6;

public int fact(){
    int i = 0;
    int f = 1;

    /* loop invariant: 0 <= i <= n && f == i! */
    /* PRE: i == 0 && f == i! */
    while (i < n) {
        i = i + 1;
        f = f * i;
    }
    /* POST: i == n && f == i! */

    return f;
}
于 2012-08-29T22:35:57.973 に答える
1

ループ不変条件は、ループの反復ごとに真でなければならない条件です。この例では、変数 の可能な値を検討していますi。ループの開始時、 の値iは 0 です。ループの最後の繰り返しで、 はループの開始時にiにインクリメントさnれ、その後別の計算が行われます。したがって、このループの実行中にの値はi条件を満たします。0<=i<=n

于 2012-08-29T22:25:56.933 に答える
0

ループの最後の反復で、i5 から開始し、6 に増分されi<nます。最後の反復の完了時に保持されません。ループの不変条件は、各反復の最初 (条件) と最後 (最後のステートメントの後) で保持する必要があることに注意してください。

また、最初の反復の最後では成立しないため、0 < i< =n ではなく0 <= i<=n でなければならないことに注意してください。0<i

于 2012-08-29T22:34:45.040 に答える