|
|
21#

楼主 |
发表于 2021-11-14 06:34
来自手机
|
只看该作者
python n=3000 没有溢出,不知对错
'''
3拿1给:1+X = (1-X)*8/7,X=1/15, 最后得分 16/15
2拿2给:最后得分 16/11
1拿3给:(1+X)*2 = (1-X)*8,X=3/5, 最后得分 16/5
'''
v_res=dict()
def f(p_take,p_give):
v_idx =str(p_take)+','+str(p_give)
#print(v_idx)
if (v_idx)in v_res:
return v_res.get(v_idx)
#print(v_idx)
if p_give==p_take+1:return 2
#if p_give==1:return 1+1/(pow(2,p_take+1)-1)
if p_take==0:
v_ret = pow(2,p_give)
elif p_give==0:
v_ret = 1
else:
# (1+x)*f(p_take,p_give-1) = (1-x)*f(p_take-1,p_give)
#x = (f(p_take-1,p_give)-f(p_take,p_give-1))/(f(p_take-1,p_give)+f(p_take,p_give-1))
#v_ret = (1+x)*f(p_take,p_give-1)
a,b=f(p_take-1,p_give),f(p_take,p_give-1)
v_ret=2*a*b/(a+b)
v_res[v_idx] = v_ret
return v_ret
#手工设置递归调用深度:
import sys
import time
t=time.time()
sys.setrecursionlimit(1000000) #例如这里设置为一百万
print(f(3000,3000))
print(time.time()-t)
#[print(i,j,round(f(i,j),4))for i in range(1,11)for j in range(1,11)]
|
|