【递归调用解题】 概率问题

本文介绍了一个计算从混有红白两色球的袋中取出指定数量的球时,红球数目多于白球概率的算法。通过递归方式计算不同取球情况下红球至少出现的次数,实现这一概率的精确计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目: 

概率问题


某个袋子中有红球m个,白球n个。现在要从中取出x个球。那么红球数目多于白球的概率是多少呢?

下面的代码解决了这个问题。其中的y表示红球至少出现的次数。

这与前文的问题是等价的。因为如果取30个球,要求红球数大于白球数,则等价于至少取出16个红球。请根据仅存的线索,判断程序逻辑,并补全缺少的代码。

   m:袋中红球的数目

   n:袋中白球的数目

   x:需要取出的数目

   y:红球至少出现的次数


#include <stdio.h>

/*
    @param m 红球个数
    @param n 白球个数
    @param x 欲取球数
    @param y 至少要取的红球数
*/


double res(int m,int n,int x,int y){
    
    // 当前取一个红球的概率
    double p1;
    // 当前取一个白球的概率
    double p2;
    
    //递归结束情况
    if(m<y)
        return 0;
    if(x<y)
        return 0;
    if(y==0)
        return 1;
    if(x-n>y)
        return 1;
 
//    递归不断求解
    
    //取到一个红球
    p1 = res(m-1, n, x-1, y-1);
    
    //取到一个白球
    
    p2 = res(m,n-1,x-1,y);
    
    return (double)m/(n+m)*p1 + (double)n/(m+n)*p2  ;
    
}


int main()
{
    printf("请输入红球个数,白球个数,想要取的球数:\n");
    
    int m,n,x,y;
    scanf("%d%d%d",&m,&n,&x);
    y = x/2 + 1;
    
    double result = res(m,n,x,y);
    printf("%lf\n",result);
    return  0 ;
    
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值