首先,是的,它是硬件 - 真的尝试但不确定如果你能帮助我,那么生病的话会很开心:)
我有这段代码:
void func(int A[], int start, int n)
{
int p = n/2;
if ( 1 < n )
{
func(A, start, p);
func(A, start + p, n-p);
for (i=0; i<n; i++)
cout << A[start+i];
}
}
func(A, 0, n);
我需要给这个代码一个重复的公式。 我做的是 - 第一次递归调用是T(n / 2)。 第二 - 这是问题所在!真的很混淆添加'p'......就是这样 T(n / 2)也是? 三个 - 用于theta(n) 外部递归调用是T(n)......
你能帮助我达到最终公式吗?
由于
答案 0 :(得分:1)
如果我读得正确,您希望重复出现运行时复杂性。
对于n > 1
,您需要使用参数floor(n/2)
和参数n-floor(n/2)
,然后输出n
项。你有
T(n) = T(cost of first recursive call) + T(second rec. call) + extra work
你现在应该把它变成一个适合应用主定理的形式。
答案 1 :(得分:0)
这是一个技巧问题,或者你误解了这个问题。您拥有的是递归公式。你需要将这个公式从C ++切换到更传统的数学符号吗?需要找到一个非递归算法吗?在你对这个问题的回答中,什么是T?术语公式在这里并不适用,因为没有计算出任何东西。这是一个永远不会修改给定数组的void函数。所有发生的事情是数组中的一些元素以某种顺序放在屏幕上。
我将首先通过跟踪示例来了解发生了什么。
让我们说A = {1,2,3,4}
然后'func(A,0,4)'是:
tracing func(A,0,4) :
p = 2
func(A,0,2)
func(A,2,2)
cout << 1 2 3 4
tracing func(A,0,2) :
p = 1 //start=0; n=2
func(A,0,1)
func(A,1,1)
cout << 1 2
tracing func(A,2,2) :
p = 1 //start=2; n=2
func(A,2,1)
func(A,3,1)
cout << 3 4
tracing func(A,2,1) :
p = 0 //start=0; n=1
func(A,0,0)
func(A,0,1)
cout << 1
tracing func(A,3,1) :
p = 0 //start=3; n=1
func(A,3,0)
func(A,3,1)
cout << 3
tracing func(A,2,1) :
p = 0 //start=0; n=1
func(A,0,0)
func(A,0,1)
cout << 1
此时我将停止因为这是你的作业问题。你可以从这里完成它。