1

再帰的なものを乗り越えることができるように、私はいくつかの演習を行っています。これらの1つは、再帰を使用して線形検索を書き直そうとしていることです。ここにあります:

int linearSearch(int a[], int n, int key)
{
    if (n < 0 ) 
    {
          return -1;
    }
    if(key == a[n-1])
    {
           return n - 1;
    } 
    linearSearch(a, n-1, key); // Line 1
}

returnステートメントがない場合、コードは正しく実行されませんでした。なぜreturnステートメントを1行目に置く必要があるのか​​わかりませんか?この場合、nを1減らすために、再帰的に呼び出す必要があるのはすべてですか?

4

4 に答える 4

5
linearSearch(a, n-1, key); // Line 1

return再帰呼び出しからの値を指定する必要があります。

return linearSearch(a, n-1, key);

それ以外の場合、応答は関数の最初の呼び出しまでバブリングせず、元の呼び出し元に「応答」として返されません。

n-1または-を返す基本句-1は、それを呼び出し元に返すだけです。これは同じ関数です。ただし、そこから返送しないと、元の発信者に到達することはありません。

于 2012-04-16T07:50:09.580 に答える
1

次の行は、 n = 0 の場合にクラッシュする (または予期しない値を生成する) 可能性があります。

if(key == a[n-1])

最初の if ステートメントを次のように変更する必要があります。

if (n <= 0 ) 
于 2012-04-16T07:54:59.277 に答える
0

この機能を想像してみてください(役立つかもしれません)

int fortytwo(void) {
    if (0) return 0; /* make the compiler less sad */
    42;
}
于 2012-04-16T09:40:30.587 に答える
0

変数に割り当てずに、戻り値の型を持つ関数を呼び出すことはできません。1行目linearSearch(a, n-1, key); では、関数としてのステートメントに戻り値の型があるため、ステートメントは無効です。1 行目に書く必要がありますreturn linearSearch(a, n-1, key);

于 2012-04-16T09:33:28.713 に答える