递归公式

时间:2012-03-10 11:20:05

标签: c++ data-structures recursion

首先,是的,它是硬件 - 真的尝试但不确定如果你能帮助我,那么生病的话会很开心:)

我有这段代码:

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)......

你能帮助我达到最终公式吗?

由于

2 个答案:

答案 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

此时我将停止因为这是你的作业问题。你可以从这里完成它。