伪代码递归函数

时间:2013-10-15 15:31:42

标签: algorithm recursion pseudocode

我正在为我的期中考试,其中一个练习题是:

考虑递归伪算法Milk(a),它将输入整数a> = 1。

MILK(a)
    if a = 1;
    then eat cookie;
    else drink glass of milk;
       select a random integer b with 1 <= b <= a-1
       MILK(b);
       MILK(a-b);
    endif

1)解释为什么任何整数a&gt; = 1算法MILK(a)终止

我认为对于这个因为n-1,对于递归函数MILK(b)的输入,m的可能性变得越来越小;最终达到满足条件a = 1的1;因此,吃一个cookie,从而终止算法。

2)让M(a)为运行MILK时饮用的牛奶量(a)。确定M(a)

的确切值

对于这个我假设它将是M(a)= a + a,因为每次你运行'a'是输入并且将每个输入加在一起将给你总数。

我的答案如何?或者这完全不正确。谢谢!

4 个答案:

答案 0 :(得分:2)

对于第二个问题,您可以使用总概率定律(转移到预期值 - 您可能必须搜索此值)。

M(a)表示眼镜的数量(如您所建议的那样),E()是某物的预期值。然后,这个总概率定律得出:

E(M(a)) = sum(E(M(a) | b=i) * Pr(b=i), i=1..a-1) =
        = ... =
        = 1/(a-1) * (1+sum(E(M(i)+M(a-i), i=1..a-1)))

据我了解,基本案例M(1)=0成立。

如果你转换上面的递归关系并尝试它(例如在一个小的python程序中),你应该能够识别一个可以通过归纳证明的简单模式。

答案 1 :(得分:1)

第一个答案很好。

然而,第二个不是。考虑a=1。你的答案是两杯或牛奶,而正确的答案是零。提示:尝试手工处理一些小例子,以了解算法中发生的事情。

答案 2 :(得分:1)

对于您的第一个问题,请注意下面的两个表达式都小于a,并且当a等于1时递归停止,您可以观察到有多少次调用milk()?它有限吗?

b < a
a-b < a
MILK(1) returns (no recursion)

手工计算几个值的牛奶饮料数量,你会看到一个模式。这会有所帮助。

请注意,随机数生成会增加复杂性,但问问自己,如果选择b = 1,b = 2,b = a / 2或b = a-1,结果会有所不同吗?

你的回答是正确的,但上述内容可以帮助你解释你的推理。

一旦你计算了几次打电话给MILK(v)的饮料数量,你应该可以推进MILK(v)=公式(v)的公式。

尝试MILK(3),MILK(4),MILK(5),MILK(9),

请注意,Ruby可以用很少的语法来表达你的算法,

rdm = Random.new
def milk(a)
    if(a==1) then
        print "eat cookie\n";
    else
        print "drink milk\n";
        b = Random.rand(1..a-1)
        print "rand (1,#{a-1}) #{b}\n";
        milk(b)
        milk(a-b)
    end
end
ARGV.each { |argi| milk(argi.to_i); }

答案 3 :(得分:0)

提示:计算M(a)的前几个值。了解封闭式公式。通过归纳证明。

下一个提示:请注意,值是否取决于b的每个选项?