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

题目:

概率问题

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

}
时间: 2024-10-12 14:52:24

【递归调用解题】 概率问题的相关文章

1113 递归调用的次数统计

题目来源:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1113Description如下程序的功能是计算 Fibonacci数列的第n项.函数fib()是一个递归函数.请你改写该程序,计算第n项的同时,统计调用了多少次函数fib(包括main()对fib()的调用).#include<stdio.h>int fib(int k); int main(void ){    int n;    scanf("%d", &am

python-day5-生成器迭代器及递归调用

生成器是一个可迭代的对象,它的执行会记住上一次返回时在函数体中的位置.对生成器第二次(或第 n 次)调用跳转至该函数上次执行位置继续往下执行,而上次调用的所有局部变量都保持不变. 生成器的特点:1.生成器是一个函数,而且函数的参数都会保留.2.迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的.3.函数中yield就是个生成器,多次调用时,根据调用位置依此往下执行,而无法返回 1 #__next__方法会将生成器依此调

浅谈递归调用的个人领悟

从大一开始学c,就不是挺理解递归的,最近突然有所体会: 递归调用中递归调用的函数可以把它想象成为一个树的结点,在函数中调用自身就是一个分支,直到出口条件时就是这棵树的叶子结点.叶子的值便是出口返回的值.最后从叶子结点按照你所调用的方法向上返回值,最终结束递归调用.

案例------递归调用

1  什么是递归: 实现某些功能不用递归可能要几十行代码,用递归可能几行就搞定了,而且代码清晰简洁.一直以为递归也就是自己调用自己,有一个出口条件,让他停止递归,退出函数,其实的特点并非就这些. 递归还有一个非常重要的特点:先进后出,跟栈类似,先递进去的后递出来.由于递归一直在自己调用自己,有时候我们很难清楚的看出,他的返回值到底是哪个,只要你理解了先进后出这个特点,你就会明白,第一次调用时,作为返回值的那个变量的值就是递归函数的返回值.先进后出吗,他是第一个进来,也就是最后出去的那个,当然就是

方法的创建、重载及递归调用

-----------siwuxie095 1.方法的定义 方法就是一段可重复调用的代码段 定义格式: 「方法的返回值类型为 void 时,不需要返回值,小括号 () 里可以有参数」 2.方法的重载: 方法名称相同,但是参数的类型和个数不同(即参数可辨), 通过传递参数的个数和类型不同来完成不同的功能 调用时系统自动匹配 3.方法的递归调用 递归调用是一种特殊的调用形式,就是方法自己调自己 常用于遍历(如:文件夹等) 如:从 1 加到 100 代码: package com.siwuxie095

python 3 递归调用与二分法

递归调用与二分法 1.递归调用 递归调用:在调用一个函数的过程中,直接或间接地调用了函数本身. 示例: def age(n): if n == 1: return 18 # 结束条件 return age(n-1)+2 # 调用函数本身 print(age(5)) 打印结果 26 递归的执行分为两个阶段: 1 递推 2 回溯 示例图 递归特性: 1.必须有一个明确的结束条件 2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少 3.递归效率不高,因为每次调用自身时,都会在内存中创建一个新

[java基础]递归调用

递归调用:通过调用或间接调用程序自身 递归调用最重要的一点是,一定要有个头,要是没有头,一直调用下去,就成了死循环了. 代码示例: /** * 递归调用代码示例<br> * 说明:一个方法,自己直接或间接的调用自己.<br> * @author 冲出地球 * */ public class Recursion { /** * 示例程序:阶乘<br> * 一个数的阶乘,就是从1一直乘到那个数<br> * 示例:2! = 1*2 5! = 1*2*3*4*5&l

编程题:用递归调用实现,求N!(!阶乘)。

#include<stdio.h> long fac(int n) { if(n==1) return 1L;             /*"1L"为长整型常量*/ else return n*fac(n-1); } void main() {int m; scanf("%d",&m); printf("%2d!=%d\n",m,fac(m)); } 算法解析: 运行结果: 编程题:用递归调用实现,求N!(!阶乘).,布布扣,

函数的递归调用

递归调用即在定义函数的时候,在函数内部再调用自己,也就是函数自己调用自己,通常用于计算阶乘 注意一点的是,如果函数一直调用自己,那就成了死循环了,因此我们通常会设一个条件,当条件为假时函数就终止了 In [15]: def factorial(n): ....: if n == 0: ....: return 1 ....: else: ....: return n + factorial(n-1) ....: In [16]: factorial(5) # 计算 5+4+3+2+1 Out[1