2016-06-13 6 views
-1

私はこのコードをよく理解していません。たとえば、n = 5の場合、Cで配列の最小要素を再帰的に見つけるこのコードを説明できる人はいますか?

array[5] = {13, 27, 78, 42, 69} 

誰かが説明してください。

私が理解しているのは、n = 1、それが最も低いことです。 しかし、n = 5の場合は、4番目のインデックスを4番目のインデックスと比較して最小のものを確認し、最小のものを返し、4番目のインデックスを3番目のインデックスと比較して、一番小さい?私は混乱しています。

int min(int a, int b) 
{ 
    return (a < b) ? a: b; 
} 

// Recursively find the minimum element in an array, n is the length of the 
// array, which you assume is at least 1. 
int find_min(int *array, int n) 
{ 
    if(n == 1) 
     return array[0]; 
    return min(array[n - 1], find_min(array, n - 1)); 
} 
+0

再帰的呼び出しで、配列の最後に到達するまでfind_min recurse呼び出しは戻りません。コールトレースを書き出すと、何が起きているのかがわかります。 –

+0

[再帰を伴う配列内の最小数を見つける]の可能な複製?(http://stackoverflow.com/questions/1735550/find-the-minimum-number-in-an-array-with-recursion) – Prune

答えて

1

を考えると、あなたの配列:

1. initial call: find_min(array, 5) 
     n!=1, therefore if() doesn't trigger 
2. return(min(array[4], find_min(array, 4))) 
      n!=1, therefore if doesn't trigger 
3.  return(min(array[3], find_min(array,3))) 
      n!=1, therefore if doesn't trigger 
4.   return(min(array[2], find_min(array,2))) 
        n!=1, threfore if() doesn't trigger 
5.    return(min(array[1], find_min(array,1))) 
         n==1, so return array[0] 
4.    return(min(array[1], array[0])) 
        return(min(13, 27) 
        return(13) 
3.   return(min(array[2], 13)) 
    etc... 
+0

なぜあなたはfind_min(n、4)を持っていますか?find_min(array、4)になっていませんか?ただ疑問に思う。 – user6134432

+0

ええ、タイプミス。最初のargは本当に重要ではありません。なぜなら、コールスタックでは常に一定であるからです。それはカウントする 'n'引数です。 –

+0

したがって、4番目のインデックスは、インデックス4,3,2,1,0と比較され、最小値を選択しますか? 3番目のインデックスは、3,2,1,0インデックスと比較され、最小値を選択しますか?等々? – user6134432

0

非常に簡単です。あなたが与えた例を使ってコードを実行してください。

最初にfind_min()を実行すると、配列の最後の要素の最小値(69)と残りの配列の最小値が返されます。配列の残りの部分の最小値を計算するために、それ自身を呼び出します。つまり、再帰的です。この第2レベルの呼び出しでは、番号42(新しい「最後」要素)と残りの配列の最小値とを比較します。 find_min()の最後の呼び出しは、配列 "{13}"でn = 1になるので、13を返します。呼び出されたレイヤーは、13と27を比較し、13がそれより小さいので、チェーンをバックアップします。

注:あなたのコードの逆引用符は存在しないと仮定します。

+0

だから69 42、13、27、13と自分自身を比較しますか?それから、それは13、27、13と比較するでしょうか? – user6134432

+0

後方引用符、どこですか? – user6134432

0

ソリューションが可能な最小の設定を比較し、次の数字の大きなセットを使用してその結果を比較するための最小を計算するために再帰を使用しています。各再帰呼び出しは、最小値が先頭まで泡立てるまで、後方の方法で次の要素と比較される結果を返します。再帰は初めはややこしいと思われますが、一度それに精通すれば非常に効果的です。

関連する問題