码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-02-23 09:46:34      阅读:182      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!