首页 > 其他 > 详细

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

时间:2015-02-23 09:43:17      阅读:349      评论:0      收藏:0      [点我收藏+]
题目: 

概率问题


某个袋子中有红球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 ;
    
}



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

原文:http://blog.csdn.net/zhuangjingyang/article/details/43907673

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!