算法1.1.27
来源:互联网 发布:高考改革 知乎 编辑:程序博客网 时间:2024/06/05 19:49
二项分布。估计用一下代码计算binomial(100,50,0.25)将会产生的递归调用次数
用这段代码来计算该二项分布的值是不现实的,因为这里是使用递归调用函数来实现的,在函数调用前,编译器要做很多准备工作,所以递归的层数较多时,程序运行速度会极慢,一种改善的方法是使用循环来代替递归。
这里使用了二项分布的一个推导公式:
N次试验发生K次的概率:P(N,K)=(1-p)f(N-1,k)+p* f(N-1,K-1)。
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.0-p)*binomial(N-1,k,p) + p*binomial(N-1,k-1,p);
}
public class en {
public static double[][] binomial(int N,int k,double p){
int i,j;
double[][] a=new double[N+1][k+1];
a[0][0]=1.0;
for(i=1;i<N+1;i++)
a[i][0]=a[i-1][0]*(1-p);
for(i=1;i<N+1;i++)
for(j=1;j<=i&&j<k+1;j++)
a[i][j]=(1.0-p)*a[i-1][j]+p*a[i-1][j-1];
return a;
}
public static void main(String[] args){
double[][] a=binomial(100,50,0.25);
System.out.println(a[100][50]);
}
}
虽然递归让一些代码看起来非常清晰,简洁。但,就效率上来讲,循环比递归快了很多倍,而且递归会带来程序调试上的问题,所以:慎用递归。
原文:http://www.cnblogs.com/charsandrew/p/5858005.html
- 算法1.1.27
- 1.1 算法
- 算法1.1
- 算法导论 -第一章-1.1算法
- 算法(第4版本)1.1.27
- 第一章 基本概念 1.1 算法
- 算法导论1.1
- 算法导论 1.1-1
- 算法导论1.1-2
- 算法导论1.1-3
- 算法导论 1.1-4
- CLRS 1.1算法
- 算法 练习1.1
- 算法1.1节22
- 1.1 java 排序算法
- 算法1.1.22
- 算法1.1.23
- 算法1.1 24
- oracle子查询
- office--word使用技巧——论文排版
- linux常用操作命令
- 剑指offer之和为S的连续正数序列
- 最长上升连续子序列-LintCode
- 算法1.1.27
- DL0-DL tips
- leetcode 368. Largest Divisible Subset 类似LISS最长递增子序列问题 + DP动态规划
- ***股票自动交易软件AutoStock使用说明***
- Java-Classloader-loadeClass(String,boolean)、findClass(String)类加载源码解析
- 请求分页存储管理方式
- 梯度下降(Gradient Descent)小结
- Cannot change version of project facet Dynamic web module to 2.5
- 给定一个二叉树,节点值为0-9,从根节点到叶子结点组成一个数,求二叉树所有组成的数的和