我正在为我的期中考试,其中一个练习题是:
考虑递归伪算法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'是输入并且将每个输入加在一起将给你总数。
我的答案如何?或者这完全不正确。谢谢!
答案 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
的每个选项?