这是我的算法课中的旧作业问题。我有问题的解决方案,但即使经过多次尝试,我也无法理解如何正确思考如何解决问题。
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)次。
我的教授没有得到满意的答复,如果有人能帮助我理解这一点,我将不胜感激。
谢谢!
答案 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)的值(对于大多数语言和大多数编译器来说可能就是这种情况)