算法1.1.27

二项分布。估计用一下代码计算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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值