我的任务是寻找以下问题的答案,但老实说,我完全不知道该从哪里开始。我不是在说每个人的直截了当的答案(尽管会很感激),而是我如何找到/推导它们。我了解递归,只是不了解如何找到递归方程。
a。)给出RANDOM的预期运行时间的重复次数。
b。)给出由调用RANDOM(n)执行的预期递归调用次数的精确递推方程。
c。)给出确切的递归方程,以表示第14行中的rerun语句被执行的预期次数,无论是递归还是非递归,都被调用RANDOM(n)。
伪代码:
函数RANDOM(u)
如果u = 1,则
返回(1)
其他
分配x = 0的概率为1/2或
分配x = 1的概率为1/3,或者
分配x = 2的概率为1/6
如果x = 0,则
返回(RANDOM(u-1)+ RANDOM(u-2))
结束-如果
如果x = 1则
返回(RANDOM(u)+ 2 * RANDOM(u-1))
结束-如果
如果x = 2则
返回(3 * RANDOM(u)+ RANDOM(u)+ 3)
结束-如果
结束-如果
end-RANDOM
答案 0 :(得分:0)
首先重要的是要注意,因为这些问题要求运行时间 / 否。 ,对于RANDOM
的递归调用前面的系数并不重要(因为所有答案都不取决于实际的返回值)。
此外,由于这些问题要求提供预期的数量,因此您可以概率性地混合适当的递归调用。
a)
开始非常容易。功能的概率混合:
T(u) = [1/2] * [T(u-1) + T(u-2)] +
[1/3] * [T(u) + T(u-1)] +
[1/6] * [T(u) + T(u) ] // + constant amount of work
b)
与以前相同,但请记住为每个呼叫添加一个:
N(u) = [1/2] * [N(u-1) + N(u-2) + 2] +
[1/3] * [N(u) + N(u-1) + 2] +
[1/6] * [N(u) + N(u) + 2] // no constants here
c)
这比其他两个要难。这个问题要求“ [是否所有对RANDOM(u)的调用都是递归的”),但只有第14行上的 是递归的……
,这似乎是矛盾的。无论如何忽略这个次要细节,关键要注意的是,第11行对RANDOM(u)
的调用也可以产生所需的递归调用,而不会增加总数本身。修改以上内容:
R(u) = [1/3] * [R(u) ] + // don't add 1 here
[1/6] * [R(u) + R(u) + 2] // add 2 as before
请注意,这个问题可能希望您将所有T(u), N(u), R(u)
术语重新排列到LHS中。我会把它留给你,因为它很简单。