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日

相关文章

  • win7系统中C:\documents and settings文件夹解锁访问图文教程

    “win7系统中C:\documents and settings文件夹解锁访问图文教程” 在Windows 7系统中,用户访问C:\Documents and Settings文件夹时可能会遇到无法访问的情况。这是由于Windows 7系统中,这个文件夹实际上是一个链接,指向了C:\Users文件夹。为了解决这个问题,需要解锁访问C:\Documents …

    C 2023年5月23日
    00
  • C语言学习之关键字的示例详解

    C语言学习之关键字的示例详解 什么是关键字? 在C语言中,关键字是指被编程语言所保留的具有特殊含义的标识符。这些关键字不能被用作变量名或其他标识符的名称,因为它们在编译器中与特定的语法规则绑定。 C语言有32个关键字,其中31个是保留关键字,一个是特殊标识符(即: main())。让我们详细了解这些关键字。 1. auto auto 用于声明局部变量。如果在…

    C 2023年5月24日
    00
  • C语言深入探究斐波那契数列

    C语言深入探究斐波那契数列 什么是斐波那契数列? 斐波那契数列,也称黄金分割数列,通俗地说就是以下数列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … 在数学上,斐波那契数列的递推公式为:f(n)=f(n-1)+f(n-2),其中f(0)=0,f(1)=1。可以使用递归或循环方式来实现它。 用C语言实现斐…

    C 2023年5月22日
    00
  • C#使用LitJson解析JSON的示例代码

    首先我们需要了解什么是JSON和LitJson,JSON是一种轻量级的数据交换格式,而LitJson则是一款C#的JSON序列化和反序列化库。 接下来,我们将用LitJson来解析JSON数据。以下是示例代码: 引用LitJson 在项目中引入LitJson.dll并添加LitJson命名空间 using LitJson; 创建一个类来接收JSON数据 在此…

    C 2023年5月23日
    00
  • C++ 压缩文件及文件夹方法 使用zlib开源库

    C++ 压缩文件及文件夹方法 使用zlib开源库 简介 本文将介绍如何使用zlib开源库在C++中实现文件及文件夹的压缩。 安装zlib 首先需要安装zlib开源库,可以在官网下载源码进行编译安装。也可以通过包管理器进行安装,如在Ubuntu中执行以下命令: sudo apt-get install zlib1g-dev 压缩文件 使用zlib库的压缩文件函…

    C 2023年5月23日
    00
  • C语言实现图书管理系统课程设计

    C语言实现图书管理系统课程设计攻略 需求分析 需要建立一个系统,管理图书的各种信息,包括图书的基本信息、借阅记录、归还记录等,能够方便快捷地进行增删改查的操作。 图书管理员需要有添加、删除、修改、查询图书、查询借阅记录等权限。 读者需要有借书、还书和查看自己借阅记录的权限。 系统需要支持多用户接入,管理员和读者应该有不同的登录界面。 技术选型 编程语言:C语…

    C 2023年5月23日
    00
  • C语言职工管理系统设计

    C语言职工管理系统设计攻略 目录 概述 界面设计 功能设计 代码实现 示例说明 总结 1. 概述 C语言职工管理系统设计是一个基于控制台的应用程序,旨在设计一个能够管理职工信息的管理系统,方便管理员有效地管理职工信息。 本系统的主要功能包括:添加职工、显示职工、删除职工、修改职工、查找职工、排序职工等。 2. 界面设计 首先,需要针对系统的功能进行界面设计,…

    C 2023年5月23日
    00
  • .Net行为型设计模式之策略模式(Stragety)

    .Net行为型设计模式之策略模式(Strategy) 策略模式概述 策略模式是一种行为型设计模式,它定义了一系列算法,并且将每个算法封装起来,使得它们可以互相替换。策略模式让算法的变化独立于使用它们的客户端。 策略模式的组成 策略模式由以下几个部分组成: Context:上下文对象,它持有一个具体策略的引用,并调用具体策略的算法。 Strategy:策略接口…

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