分析算法中的递归

时间:2012-05-12 08:20:36

标签: algorithm recursion time-complexity

这是我的算法课中的旧作业问题。我有问题的解决方案,但即使经过多次尝试,我也无法理解如何正确思考如何解决问题。

function h(N) {
    if (N==1) return 3;
    else { 
        sum = 1;
        i = 0;
        while (i < h(N-1))
            sum = sum + i;
            i = i + 1;
        return sum;
   }
}

据我所知,由于在while循环中重复调用h(N-1),while循环应该运行与h(N-1)返回的次数一样多的次数。除此之外,while循环中的函数调用h(N-1)也会发生很多次。因此,据我所知,我应该得到这样的东西:

T(N)= T(N-1)* H(N-1)+ C * H(N-1)+ D

其中
1. T(N)是运行时间,
2. T(N-1)* H(N-1),因为对h(N-1)的一次递归调用将取T(N-1)并且因为每次进行比较时它都被重新计算,所以它将被调用H(N-1)次。 (其中H(N-1)是从通话中返回的值) 3.和C * H(N-1)是while循环内语句的运行时间(因为while循环运行H(N-1)次。

我的教授没有得到满意的答复,如果有人能帮助我理解这一点,我将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:2)

尝试分两步了解这一点,首先考虑这个更简单的函数,我们用while替换if循环。

function g(N) {
    if (N==1) return 3;
    else { 
        sum = 1;
        i = 0;
        if(i < g(N-1))
            sum = sum + i;
            i = i + 1;
        return sum;
   }
}

在这里,我们得到了重复:

G(N) = G(N-1) + O(1)

到目前为止,这么好吗?在这里,计算g(N)的工作包括解决较小的问题g(N-1)加上一定量的工作。

现在,让我们回到原来的函数h(N)。发生了什么变化?现在,计算h(N)的工作涉及解决子问题h(N-1),h(N-1)次。在每个时代(即在while循环中),我们都会做一些不变的工作。还有另一个恒定量的工作仅在h(N)中完成一次,即在while循环之外。所以,我们基本上得到:

H(N) = H(N - 1) *{H(N - 1) + O(1)}  + O(1)

我们可以通过替换T(n) = H(n) + O(1)来重写上述内容。因此,我们得到:

T(N) = H(N - 1) * T(N - 1)  + O(1)

答案 1 :(得分:1)

假设在执行h(N)时,在循环的每次迭代中重新计算h(N-1)的值(对于大多数语言和大多数编译器来说可能就是这种情况)

enter image description here