次のアルゴリズムの時間の複雑さを分析することに行き詰まっています。
def fun (r, k, d, p):
if d > p:
return r
if d = 0 and p = 0:
r <- r + k
return r
if d > 0:
fun (r, k + 1, d - 1, p)
if p > 0:
fun (r, k - 1, d, p - 1)
ルートの呼び出しは次のようになりますfun (0, 0, n, n)
し、n
問題の大きさです。
再帰関係はであり、T (2 n )= 2 T (2 n − 1と同等))なので、。
私の分析は正しいですか(私はそれが非常に完全かつ正確ではないことを知っています)?深刻な欠陥がある場合は、指摘するか、このアルゴリズムの時間の複雑さについての正確かつ完全な証拠を示してください。
d>0
とp>0
。3番目と4番目のifステートメントに到達した場合、関数が何を返すかは示していません。?をreturn
再帰的に呼び出すたびにステートメントがあるということfun
ですか?(もしかしてfun (r, k + 1, d - 1, p)
ことreturn fun (r, k + 1, d - 1, p)
?)またはあなたが持っている意味したreturn
関数本体の最後に文を?疑似コードを編集して明確にし、考えられるすべての場合にこれが何を返すかを確認してください。
d<=p
、仮に、d>0
そしてp>0
すべてが成立するとします。何が起こるはずですか?アルゴリズムは関数に対して2回の再帰呼び出しを行いますか?またはfun(r, k + 1, d - 1, p)
、再帰的に呼び出すことなく、再帰的に呼び出してすぐに戻るのfun(r, k - 1, d, p - 1)
ですか?私があなたの疑似コードを文字通りに受け取った場合、それは2つの再帰呼び出しを行ってから未定義の戻り値で戻るように見えます-しかしそれは奇妙に思え、疑似コードにタイプミス/バグがあるのではないかと思います。