我很难理解如何发展复发关系。我给出的代码是
int result = bizarre(n, n);
public static int bizarre (int first, int second)
{
if (second <= 1)
{
int temp = 0;
for (int i = 0; i < first; i++)
temp += i;
return temp;
}
return bizarre (first, second-1);
}
从我的理解是
T(n) = n + 1
T(1) = 1
但这似乎并不合适。有人可以帮助我吗?
答案 0 :(得分:0)
通常,递归关系由
给出T(n) = no. of subproblems generated at each step * T(size of each subproblem) + complexity of the divide/conquer step
和
T(1) = complexity of base case(s)
在您的示例中,变量“second”在每次递归调用时变小1。此外,您在每个步骤创建的子问题的数量只有一个,因为您只调用该方法一次。
除了比较之外,代码在每个递归步骤中都没有真正做任何工作,因此这是一个O(1)操作。
所以,
T(n) = T(n - 1) + O(1)
最后,T(1)是在基本情况下发生的事情,它是n个数字的总和。
T(1) = O(n)
答案 1 :(得分:0)
我认为你遇到麻烦的原因之一是函数有两个独立的参数,所以你的递归关系需要有两个不同的参数来解释这个。
在第二个参数为0或1的情况下,您的工作与第一个参数成比例。你可以把它写成
T(m,1)=Θ(m)。
否则,该函数执行一定量的工作,然后对相同的第一个输入和递减的第二个输入进行递归调用。这是这样的:
T(m,n)= T(m,n-1)+ O(1)。
你认为你可以从那里解决问题吗?