再帰メソッドのビッグ O を見つけるために、マスター定理を参照することをお勧めします。ウィキペディアの記事は次のとおりです。 http://en.wikipedia.org/wiki/Master_theorem
ツリーのような再帰的な問題を考えたいとします。次に、ツリーの各レベルと必要な作業量を検討します。問題は通常、ルートが重い (最初の反復 >> ツリーの残りの部分)、バランスの取れた (各レベルの作業量が等しい)、リーフが重い (最後の反復 >> ツリーの残りの部分) の 3 つのカテゴリに分類されます。
マージソートを例にとると:
define mergeSort(list toSort):
if(length of toSort <= 1):
return toSort
list left = toSort from [0, length of toSort/2)
list right = toSort from [length of toSort/2, length of toSort)
merge(mergeSort(left), mergeSort(right))
mergeSort を呼び出すたびに、元の長さの 1/2 のさらに 2 つの mergeSort が呼び出されることがわかります。マージ手順には、マージされる値の数に比例して時間がかかることがわかっています。
再帰関係は、T(n) = 2*T(n/2)+O(n) です。2 つは 2 つの呼び出しからのもので、n/2 は要素の数が半分しかない各呼び出しからのものです。ただし、各レベルには、マージする必要がある同じ数の要素 n があるため、各レベルでの一定の作業は O(n) です。
作業が均等に分散され (深さごとに O(n))、ツリーの深さが log_2(n) であることがわかっているため、再帰関数の大きな O は O(n*log(n)) です。