1

再帰によって配列を出力する関数を作成しようとしています。

3 つの関数を書きましたが、原理的には同じようです。

void printArray0( int theArray[], int theSize, int theIndex = 0 )
{
    cout << theArray[theIndex] << ' ';
    if ( ++theIndex != theSize ) printArray0( theArray, theSize, theIndex );
    else cout << endl;
}

void printArray1( int theArray[], int theElementLeft )
{
    cout << *theArray << ' ';
    if ( theElementLeft != 1 ) printArray1( theArray+1, theElementLeft-1 );
    else cout << endl;
}

void printArray2( int theArray[], int theSize )
{
    static int myIndex = 0;
    cout << theArray[myIndex] << ' ';
    if ( ++myIndex != theSize ) printArray2( theArray, theSize );
    else cout << endl;
}

それで、それらの間に大きな違いはありますか?

ある場合、どの機能が最も速く、最も安全ですか?

他の人の経験から学べることを願っています:)

4

3 に答える 3

1

どちらもあまり意味がありません。誰もがこれに再帰を使用する理由はありません。最初のバージョンは、最も読みやすいため、おそらくそれほど悪くはありません。

のバージョンstaticは、スレッド セーフではないため、最も危険です。そして static を使用すると、再帰全体が (さらに) 無意味になります。

一般に、再帰が理にかなっているケースはほとんどなく、これはその 1 つではありません。パラメータが正しくない場合に再帰が停止するという保証がないため、3 つのバージョンはすべて危険です。3 つのバージョンはすべて、単純なループよりもはるかに多くの RAM メモリを消費し、実行速度が遅くなりますが、プログラムが読みにくくなります。プログラムは、スタック オーバーフローに対して脆弱になります。

コンパイラは通常、再帰をそれほど効率的に最適化しません。実行するかどうかは、「末尾再帰」を使用するかどうかによって異なります。

ちなみに、コーディングとインデントのスタイルは判読不能で安全ではありません。if/else の後に続く行ごとに新しい行を使用{}し、常にすべての if/else ステートメントに使用します。

于 2013-04-10T14:33:34.370 に答える