题目内容
解题思路
步骤
小Q与小K都喜欢吃糖豆。 但是糖豆分两种,超甜糖豆和普通糖豆。 现在有w(>=0)个超甜糖豆和b(>=0)个普通糖豆。 小Q和小K开始吃糖豆,他们决定谁先吃到超甜糖豆谁就获胜。 小K每次吃的时候会捏碎一颗糖豆。 小Q先吃,小Q想知道自己获胜的概率。 如果两个人都吃不到超甜糖豆小K获胜。(结果保留9位小数)
利用递推关系
1.导出递推式
设(m,n)情况下小Q获胜的概率为p(m,n)
#小Q第一次就吃到:m/(m+n)
#小Q第一次没吃到:
#(1)小K捏碎了超甜的然后吃甜的:n/(m+n)*m/(m+n-1)*(n-1)/(m+n-2)*p(m-1,n-2)
#(2)小K捏碎了超甜的然后吃甜的:n/(m+n)*(n-1)/(m+n-1)*(n-2)/(m+n-2)*p(m,n-3)
#由此知递推式:
p(m,n)=m/(m+n)+n/(m+n)*(m/(m+n-1)*(n-1)/(m+n-2)*p(m-1,n-2)+\
(n-1)/(m+n-1)*(n-2)/(m+n-2)*p(m,n-3))
2.研究递推式的限制条件,补充空白区域的实现
观察递推式:发现 (m=0,n),(m,n=0),(m,n=1),(m,n=2)需要补充(不能利用上面得到的递推式)
def p(m,n):
if m==0:
return 0
elif n==0:
return 1
elif n==1:
return m/(m+n)
elif n==2:
return m/(m+2)+2/(m+2)*m/(m+1)/m
完整代码如下:
x=float(input())
y=float(input())
def p(m,n):
if m==0:
return 0
elif n==0:
return 1
elif n==1:
return m/(m+n)
elif n==2:
return m/(m+2)+2/(m+2)*m/(m+1)/m
else:
return m/(m+n)+n/(m+n)*(m/(m+n-1)*(n-1)/(m+n-2)*p(m-1,n-2)+\
(n-1)/(m+n-1)*(n-2)/(m+n-2)*p(m,n-3))
print('%.9f'%(p(x,y)))
function [r] = p(m,n)
if m==0
r=0;
elseif n==0
r=1;
elseif n==1
r=m/(m+2);
elseif n==2
r=m/(m+2)+2/(m+2)*m/(m+1)/m;
else
r=m/(m+n)+n/(m+n)*(m/(m+n-1)*(n-1)/(m+n-2)*p(m-1,n-2)+...
(n-1)/(m+n-1)*(n-2)/(m+n-2)*p(m,n-3));
end
x=input('');
y=input('');
a=p(x,y);
digits(9)
b=vpa(a)
关于matlab里面如何保留小数特定位数参见:matlab如何保留指定小数位数