如何找到一个递归方程式(针对此伪代码)?

时间:2018-09-27 14:57:26

标签: recursion equation equation-solving

我的任务是寻找以下问题的答案,但老实说,我完全不知道该从哪里开始。我不是在说每个人的直截了当的答案(尽管会很感激),而是我如何找到/推导它们。我了解递归,只是不了解如何找到递归方程。

a。)给出RANDOM的预期运行时间的重复次数。

b。)给出由调用RANDOM(n)执行的预期递归调用次数的精确递推方程。

c。)给出确切的递归方程,以表示第14行中的rerun语句被执行的预期次数,无论是递归还是非递归,都被调用RANDOM(n)。

伪代码:

  

函数RANDOM(u)

     
      
  1. 如果u = 1,则

  2.   
  3. 返回(1)

  4.   
  5. 其他

  6.   
  7. 分配x = 0的概率为1/2或

  8.   
  9. 分配x = 1的概率为1/3,或者

  10.   
  11. 分配x = 2的概率为1/6

  12.   
  13. 如果x = 0,则

  14.   
  15. 返回(RANDOM(u-1)+ RANDOM(u-2))

  16.   
  17. 结束-如果

  18.   
  19. 如果x = 1则

  20.   
  21. 返回(RANDOM(u)+ 2 * RANDOM(u-1))

  22.   
  23. 结束-如果

  24.   
  25. 如果x = 2则

  26.   
  27. 返回(3 * RANDOM(u)+ RANDOM(u)+ 3)

  28.   
  29. 结束-如果

  30.   
  31. 结束-如果

  32.   
     

end-RANDOM

1 个答案:

答案 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中。我会把它留给你,因为它很简单。