0

再帰関数に少し問題があります。整数を含む配列を渡すと、関数はそれらをすべて加算または減算します。加算機能は正しく実装されましたが、減算ビットを正しく取得するのに苦労しています。

これが私が気づいたことです: size は現在 5 に設定されています。それをテストするために、関数の減算部分の if(i == size) 行を if(i == (size - 3)) に変更し、最初の要素から 2 番目の要素を正しく減算しているように見えます (4 - 2)。しかし、もう一度実行すると、(4-2) - 7 = -5 の代わりに 9 が得られます。おそらく-7を追加していますか?

また、すべての指針に本当に感謝していますが、これが私がやろうとしていることを達成するための最も効率的なプログラムではないかもしれないことも認めています. 私は初心者のプログラマーであり、代わりにアルゴリズムをどのように行うべきだったかとは対照的に、現在のプログラムでどこが間違っているかを確認するのに最も役立ちます。

#include<iostream>

using namespace std;


int reduceArray(int array[], int size, char op, int i = 0)
{
    if(op == '+')
    {
        if(size == 0)
        return 0;

        if(i == size)
        return 0;

        else
        { 
            return array[i++] + reduceArray(array, size, '-', i + 1);   
        }
    }

    else if(op == '-')
    {
        if(size == 0)
        return 0;

        if(i == (size - 2)) //changing this to "size - n" changes how many numbers are subtracted
        return 0;

        else
        { 
            return array[i++] - reduceArray(array, size, '-', i + 1);   
        }
    }
}

int main()
{
    int array[] = {4, 2, 7, 1, 9};

    //cout << reduceArray(array, 5, '+') << endl; this bit works fine works fine
    cout << reduceArray(array, 5, '-') << endl;
    system("pause");
    return 0;
}

編集:実際には、部門プログラムでも同じことが起こります。配列の 3 番目の要素 (7) については、INVERSE 演算を実行しています。減算する必要がある場合は加算し、除算する必要がある場合は乗算します。なぜこれが起こっているのかわかりません。

4

1 に答える 1

0

i関数を呼び出した直後に変更しています。関数が戻った後、i1 ずつインクリメントされます。から値をarray[i]取得すると、間違った要素が取得されます。つまり、 array[i + 1] =. また、配列の末尾を超えて要素にアクセスしています。

この演算子のコードは、期待どおりに左から右ではなく、右から左に計算を行っています。計算が完了する前に常に呼び出しreduceArrayているため、配列の最後まで進み、バックトラック (戻り) を開始し、戻るたびに計算を実行します。これを修正するには、呼び出す前に計算をreduceArray行い、返された結果に対して別の計算を実行する必要があります。

if(i < (size - 3)) // This MUST be -1 in order to go to the end of the array!
{
    // We're operating on the current array entry and the next entry.
    // this is why (size - 1) is necessary to prevent accessing beyond
    // the end of the array.
    int result = array[i] - array[i + 1];
    i += 2;
    return result - reduceArray(array, size, '-', i);
}
return array[i];

-5これは、期待どおりの結果として返されます。

于 2013-04-28T01:36:02.813 に答える