再帰関数を分析する (またはそれらを評価する) ことは、重要な作業です。(私の意見では) Don Knuths Concrete Mathematicsに良い紹介があります。
ただし、これらの例を分析してみましょう。
関数に必要な時間を与える関数を定義します。が、つまり の関数 がt(n)
必要とする時間を表すとしましょう。pow(x,n)
n
をt(0)=c
呼び出すとpow(x,0)
、( n==0
) かどうかを確認してから 1 を返す必要があるため、これは一定の時間で実行できます (したがって定数c
)。
ここで、他のケースを考えます: n>0
. ここで を得るt(n) = d + t(n-1)
.これは、 を再度チェックしn==1
、 を計算pow(x, n-1
し、したがって ( t(n-1)
) を計算し、その結果に を掛ける必要があるためx
です。チェックと乗算は一定時間 (定数) で実行でき、ニーズd
の再帰計算が可能です。pow
t(n-1)
これで、用語を「展開」できますt(n)
。
t(n) =
d + t(n-1) =
d + (d + t(n-2)) =
d + d + t(n-2) =
d + d + d + t(n-3) =
... =
d + d + d + ... + t(1) =
d + d + d + ... + c
では、 に到達するまでにどのくらいかかりt(1)
ますか? から開始しt(n)
、各ステップで 1 を減算n-1
するため、 に到達するにはステップが必要ですt(n-(n-1)) = t(1)
。n-1
一方、それは、定数 の倍数を取得しd
、 にt(1)
評価されることを意味しc
ます。
したがって、次のようになります。
t(n) =
...
d + d + d + ... + c =
(n-1) * d + c
したがってt(n)=(n-1) * d + c
、O(n) の要素であることがわかります。
pow2
マスターの定理を使用して行うことができます。アルゴリズムの時間関数は単調に増加すると想定できるためです。これt(n)
で、 の計算に必要な時間が得られましたpow2(x,n)
。
t(0) = c (since constant time needed for computation of pow(x,0))
n>0
私たちが得るために
/ t((n-1)/2) + d if n is odd (d is constant cost)
t(n) = <
\ t(n/2) + d if n is even (d is constant cost)
上記は次のように「簡略化」できます。
t(n) = floor(t(n/2)) + d <= t(n/2) + d (since t is monotonically increasing)
これはt(n) <= t(n/2) + d
、マスターの定理を使用して解決できますt(n) = O(log n)
(ウィキペディアのリンクにある「一般的なアルゴリズムへの適用」のセクションを参照してください。例「二分探索」)。