如何找到递归方法的递归关系?

时间:2016-02-05 23:54:29

标签: java arrays recursion recurrence

所以我试图找到这个java方法的递归关系:

public static Pair min/max(int start, int end, int[] a) {
        int mid;
        Pair pair = new Pair(a[start], a[end]);
        Pair p1;
        Pair p2;

        if (start == end) { //if n = 1
            return pair;
        }

        else if (end == start + 1) { //if n = 2
            if (a[start] > a[end]) {
                pair.upper = a[end];
                pair.lower = a[start];
            } else {
                pair.upper = a[start];
                pair.lower = a[end];
            }
            return pair;
        }

        mid = (end + start) / 2; //if n > 2
        p1 = min/max(end, mid, a);
        p2 = min/max(mid + 1, ub, a);

        if (p1.lower < p2.lower)
            pair.upper = p1.lower;
        else
            pair.lower = p2.lower;

        if (p1.upper > p2.upper)
            pair.upper = p1.upper;
        else
            pair.upper = p2.upper;

        return pair; //the min and max pair
    }

这应该通过总是使用⌈3n/ 2 - 2⌉比较来找到数组的最大值和最小值。它也使用这个类:

class Pair {
   int lower;
   int upper;
   Pair ( int a, int o ) { lower = a; upper = o; }
}

那么这个方法的递归关系是什么?我知道它的开头是:

C(n) = 0 if n=1
       1 if n=2

现在我想弄清楚当n>时方程式是什么? 2.首先,上述方法总是在⌈3n/ 2 - 2⌉比较中运行。我只是想知道因为行mid = (lb + ub) / 2让我觉得我仍然将数组分成⌈n/2⌉和⌊n/2⌋部分,这些部分不会让我⌈3n/ 2 - 2 each每次比较。我知道有更好的方法来做同样的事情,但我写的代码必须使用递归。

更新:添加计数器语句后,我发现上面的代码不对每个数组使用⌈3n/ 2 - 2⌉比较。我认为问题在于变量mid。中间我应该分裂阵列,但我不认为我正确分裂它以进行适当数量的比较。

1 个答案:

答案 0 :(得分:0)

n = end - start + 1。我认为你的意思是表示比较次数的复发。

在一般情况下,您对每个递归级别进行4次比较,并将列表拆分为一半。所以复发是:

T(n) = 4 + T( floor(n/2) ) + T( ceiling(n/2) ) for n > 1

注意:您似乎已经开始使用lbub,并且仅部分切换为startend