题目:
分析:
以当前牌的和为节点来看,
假设当前手中牌总和是5,
下一张抽到1,总和6,获胜概率为P1
下一张抽到2,总和7,获胜概率为p2
下一张抽到3,总和8,获胜概率为p3
。。。。
总的获胜概率为(P1+P2+P3…+P10)/10
代码:
package main
import(
"fmt"
)
func winprobobalitly(current int) float64{
if current>=17 && current<21{
return 1.0
}
if current>21{
return 0.0
}
wp:=0.0
for i:=1;i<=10;i++{
tmp:=winprobobalitly(current+i)
wp+=tmp
}
return wp/10
}
func main(){
fmt.Println(winprobobalitly(0))
}
验证
当current=16
抓取下一张牌得到的和分别是:17,18,19,20,21,22,23,24,25,26,
概率分别是:1,1,1,1,0,0,0,0,0,0
4/10=0.4,也就是说当i=16时的概率是0.4,往前推i=15是的概率就是
运行结果:
往前推i=15时抽到的牌是16,17,18,19,20,21,22,23,24,25
对应的概率分别是 0.4,1,1,1,1,0,0,0,0,0
4.4/10=0.44
再往前推 i=14,是的概率就是15,16,17,18,19,20,21,22,23,24
对应的概率是:0.44,0.4,1,1,1,1,0,0,0,0
4.84/10=0.484
如此,得到每一个i的概率,加起来除以10
由此,来总结下递归的一些思想
1,想好base case,base case的return值就是最后往上返回的值
2, 把问题拆分成当前i,i之前,i之后,让递归算出之前的i,然后理清当前的i如何计算,交给之后的i
3,递归就是一直深度遍历到base case,返回base case给你的值,然后你根据业务决定是要最大值,最小值,sum等等,递归总会碰到base case,向上返回,这就是我理解递归的思想