2012-04-16 19 views
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だけ減らすために再帰的に呼び出す必要がありますか?

答えて

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

あなたは再帰invokationから値をreturn必要があります。そうしないと、答えは、関数の最初のinvokationまでの道をバブリングされていない、ととして返されることはありません

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

元の発信者に「回答」します。

n-1または-1を返すベース句は、呼び出し元に返すだけです。これは同じ関数です!そこから戻らずに、元の発信者には届きません。

1

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

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

を変更する必要があり、あなたの文がする場合は、最初:

if (n <= 0) 
+0

return linearSearch(a, n-1, key);を書く必要があります...変更が必須であってもn> 0の場合。 – smichak

0

あなたは、いくつかの関数を呼び出すことはできません戻り値の型を変数に代入せずに返します。 1行目では、関数としてのlinearSearch(a, n-1, key); のステートメントには戻り値の型があるため、ステートメントは無効です。 1.

0

Imaginaは、この関数は(多分それは役立ちます)、これは最終的にすべてのnについても同様です再帰ですので あなたはラインで

int fortytwo(void) { 
    if (0) return 0; /* make the compiler less sad */ 
    42; 
} 
関連する問題