Java编程二项分布的递归和非递归实现代码实例

Java编程二项分布的递归和非递归实现攻略

什么是二项分布?

二项分布是离散分布中的一种,描述了在n次独立重复进行相同的随机实验中,恰好出现k次成功的概率。在很多领域中得到广泛的应用,例如统计学、质量控制、信号处理等等。

二项分布是由n和p两个参数所决定,其中n表示实验的次数,p表示每次实验成功的概率。用数学公式表示为:

$$ P(X = k) = \binom{n}{k} p^k (1-p)^{n-k} $$

其中,$ \binom{n}{k} $ 表示在n次实验中,取出k个成功的组合数。

递归实现二项分布

二项分布的递归实现方法需要用到数学中的杨辉三角,即二项式系数的组合数数组,可以通过递归函数的方式计算。

代码实现如下:

public static double binomial(int n, int k, double p) {
    if (n == 0 && k == 0) return 1.0;
    if (n < 0 || k < 0) return 0.0;
    return (1 - p) * binomial(n-1, k, p) + p * binomial(n-1, k-1, p);
}

其中,n、k、p分别为二项分布的三个参数,函数的返回值为概率值。

非递归实现二项分布

递归实现方法虽然简单易懂,但递归过程中会导致重复计算,影响程序效率,因此还可以采用非递归实现方法。

使用非递归方法,可以利用之前求解的结果,节省计算时间,提高效率。具体实现如下:

public static double binomial(int n, int k, double p) {
    double[][] dp = new double[n + 1][k + 1];
    dp[0][0] = 1.0;
    for (int i = 1; i <= n; i++) {
        dp[i][0] = (1 - p) * dp[i-1][0];
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= k; j++) {
            dp[i][j] = (1 - p) * dp[i-1][j] + p * dp[i-1][j-1];
        }
    }
    return dp[n][k];
}

函数的返回值与递归实现方法一样,都是概率值。

示例说明

示例一

在一次考试中,一个学生有75%的概率回答正确,如果这次考试共有10道题目,求该学生能够回答出6道题目的概率。

double p = 0.75;
int n = 10;
int k = 6;
System.out.println("递归实现概率值:" + binomial(n, k, p));
System.out.println("非递归实现概率值:" + binomial(n, k, p));

输出:

递归实现概率值:0.2128400803803018
非递归实现概率值:0.21284008038030179

示例二

在一批物料中,有10%的物料存在缺陷,要求从该批物料中取出20个,求取出5个有缺陷的物料的概率。

double p = 0.1;
int n = 20;
int k = 5;
System.out.println("递归实现概率值:" + binomial(n, k, p));
System.out.println("非递归实现概率值:" + binomial(n, k, p));

输出:

递归实现概率值:0.026424561178150988
非递归实现概率值:0.026424561178150997

以上两个示例都使用了递归和非递归两种实现方式,并且结果完全一致。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java编程二项分布的递归和非递归实现代码实例 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C 程序 对字符串集排序

    下面是详细讲解“C 程序 对字符串集排序”的完整使用攻略。 概述 在 C 语言中,我们可以使用 qsort() 函数对字符串集进行排序。具体来说,我们需要填写几个参数,包括要排序的字符串数组指针、字符串数组中字符串的个数、每个字符串的长度、和一个比较函数指针。比较函数指针是用来告诉 qsort() 函数如何进行排序的,这个函数会比较两个字符串,然后返回一个负…

    C 2023年5月9日
    00
  • Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space

    Python 字符串处理中的特殊空格包括非换行空格(Non-breaking space)、制表符(Tab)和换行符(Newline)。在字符串处理中,这些特殊空格可能会对文本处理和分析造成一定的影响。 非换行空格 非换行空格通常是由于文本的格式化处理而产生的,它可以通过 Unicode 编码表中的字符 \xc2\xa0 表示。在 Python 中,可以通过…

    C 2023年5月22日
    00
  • C语言实现逆序输出详细

    当我们需要逆序输出一个字符数组或字符串时,我们可以使用C语言中的循环语句和数组下标实现。 首先,我们先定义一个字符数组或字符串,存储数据。接着,我们创建一个循环语句,从最后一个元素开始逆序输出到第一个元素。最后,我们在每个元素之间添加一个空格或其他特定符号,以便于人类阅读。 以下是完整的C语言实现逆序输出的攻略: 步骤如下: 1. 定义字符数组或字符串 我们…

    C 2023年5月23日
    00
  • AngularJs directive详解及示例代码

    关于AngularJS directive详解,我将分以下几个部分进行讲解: Directive 是什么? Directive 的基本概念 Directive 的分类 Directive 的语法 Directive 的示例说明 Directive 是什么? Directive(指令)是 AngularJS 中最重要的一项功能。Directive 可以让你自定…

    C 2023年5月22日
    00
  • C语言中如何进行运算?

    在C语言中,运算是指将一个或多个操作数结合在一起并应用特定的运算符以生成一个结果。C语言中支持多种运算类型,如算术运算、赋值运算、比较运算、逻辑运算等。 算术运算 C语言中的算术运算包括加、减、乘、除、取模等操作。其中,加、减、乘、除分别对应运算符 +、-、*、/,取模使用运算符%。下面是算术运算的示例代码: #include<stdio.h> …

    C 2023年4月27日
    00
  • 华为C8816怎样申请官方解锁码和一键解锁

    华为C8816怎样申请官方解锁码和一键解锁攻略 什么是官方解锁码? 官方解锁码是指厂商(如华为、小米等)提供的一种解锁手机 bootloader 的解锁码。通常情况下,手机的 bootloader 是由厂商加密的,无法直接修改系统文件。而通过解锁 bootloader,就可以进入到手机的刷机模式,安装第三方ROM等操作。 一、如何申请官方解锁码? 官方解锁码…

    C 2023年5月23日
    00
  • Java的Jackson库的使用及其树模型的入门学习教程

    Java的Jackson库的使用及其树模型的入门学习教程 什么是Jackson库 Jackson是一个在Java平台上解析JSON的框架,它是一个高性能的开源库,同时还具有灵活而强大的功能,可以方便地将Java对象序列化为JSON格式的数据,或者将JSON数据反序列化为Java对象。 Jackson库的基本使用 Jackson库的基本使用分为序列化和反序列化…

    C 2023年5月23日
    00
  • C程序 用函数显示两个区间的素数

    下面是“C程序 用函数显示两个区间的素数”的完整使用攻略。 1.功能介绍 此程序通过定义一个函数来显示两个区间内的素数。输入两个整数,程序将找到这两个整数之间所有的素数,并显示出来。 2. 使用方法 2.1 下载程序 将程序的代码复制到你的集成开发环境(IDE)中,并保存到c文件中,例如:prime_numbers.c 2.2 定义输入 在程序的main函数…

    C 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部