我正在学习时间复杂性并具备此功能:
public static double pow( double x, int n ) {
if( n==0 ) return 1.0;
return x*pow(x,n-1);
}
我的任务是找到它的时间复杂度的递归关系,我知道答案是T(n)= T(n-1)+ O(1),我不知道理解,因为我认为它应该是T(n)= T(n-1)+ O(n)。我的理由是我将每个递归调用乘以x,这发生了n次,因此O(n)正确?
*编辑:我想我明白自己的错误。 T(n)= T(n-1)+ O(1)仅用于该特定调用,因此显然为O(1)并且求解递归导致n * T(n-1)+(n-1)O (1)所以忽略(n-1)O(1),因为它小于n * T(n-1)。所以我们得到增长的顺序= O(n)。
答案 0 :(得分:0)
您无需考虑每次乘法。递归关系是关于一个号码的呼叫如何与不同号码的相同呼叫相关。在这种情况下,计算pow(x,n)
要求您已经知道pow(x,n-1)
- 这是T(n) = T(n-1)
部分。现在,鉴于您已经拥有pow(x,n)
,您还需要做些什么来计算pow(x,n-1)
?这只是一次乘法 - x*pow(x,n-1)
- 即O(1)
,因此总递归关系为T(n) = T(n-1) + O(1)
。所有其他乘法都已计入T(n-1)
...