算法20-抽牌获胜概率问题,理解递归base case

题目:
在这里插入图片描述
分析:
以当前牌的和为节点来看,
假设当前手中牌总和是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,向上返回,这就是我理解递归的思想

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值