题目描述:
牌堆有无限多张点数均匀分布在1-13间的牌,你可以抽取任意张。你的初始点数是0,当你手中牌点数之和位于[21,24)时获胜,否则失败。求你获胜的概率。
思路:
采用递归的方式计算在当前点数和的情况下获胜的概率。我们使用一个字典memo来记录已经计算过的点数和对应的概率,避免重复计算。最后,输出在点数和为0的情况下获胜的概率。
代码演示:
def win_probability(sum_point, memo):
if sum_point >= 21 and sum_point < 24:
return 1
if sum_point >= 24:
return 0
if sum_point in memo:
return memo[sum_point]
win_prob = 0
for i in range(1, 14):
win_prob += 1 / 13 * win_probability(sum_point + i, memo)
memo[sum_point] = win_prob
return win_prob
memo = {}
result = win_probability(0, memo)
print(result)
测试用例:
#用例如下: