int Do(int n)
{
if(n<=2)
return 1;
else
return(Do(floor(sqrt(n))+n);
}
再帰関係を次のように使用できますT(square root(n)+n))+1
か? もしそうなら、どうすればこの問題をさらに進めることができますか?
int Do(int n)
{
if(n<=2)
return 1;
else
return(Do(floor(sqrt(n))+n);
}
再帰関係を次のように使用できますT(square root(n)+n))+1
か? もしそうなら、どうすればこの問題をさらに進めることができますか?
あなたの質問のように再帰が終了することはありません(少なくとも理論的には、おそらくあなたが話していることです)。理由:n + floor(sqrt(n))
より大きいn
。
私はあなたが意味すると思いますreturn Do(floor(sqrt(n))) + n
。この質問に答えるために一般的な考慮事項を続けますが、注意してください。自分で埋めなければならないギャップがいくつかあります。
実行時間に関する質問を 2 つの部分に分割します。
再帰の数: n
2 の累乗として書きます (つまりn=2^(ld n)
、ld
は底 2 の対数を示します)。n
respの平方根を取る。2^(ld n)
指数を半分にします。基本ケースに到達するには、指数が 1 未満になるまで指数を半分にする必要があります。ld n
これは、何かに到達するまでどのくらいの頻度で半減しなければならないかという疑問につながります<= 1
。この質問に対する答えは、おおよそld ld n
です。つまり、基本ケースまで大まかに ld ld n
再帰があります。
ここで、再帰を実行して要約します。
T(n) = T(2^(ld 2))
= T(2^((ld 2)/2)) + 1
= T(2^((ld 2)/4)) + 1 + 1
= ...
= T(2^((ld 2)/(2^(ld ld 2)))) + sum(1, i=0...(ld ld 2)-1)
= 1 + (ld ld 2) - 1
合計を単純化し、 - 部分の詳細を調整する必要がありfloor
ます。
任意の数 n と n = 2^k を取ります。n の平方根は、指数の半分を意味します。したがって、O(log k) 平方根しか存在できません。
n =2^k したがって、k = log n . 次に、O(log k) は O(loglogn) に変わります ...