算法第四版35页问题1.1.27,估计用一下代码计算binomial(100,50,0.25)将会产生的递归调用次数:

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)
}

虽然书上只让估计调用次数,但是觉得想知道到底调用了几次。

我用图画出递归调用的情况

可以看出递归中有很多重复调用比如,第4层递归 分别调用了binomial(n-3,k-1,p)和binomial(n-3,k-2,p)三次。这就是这个算法效率低的原因。可以看出重复调用的次数是一个杨辉三角

根据杨辉三角的性质,

第m层递归函数被调用的情况为:

第m层第x(x<=m)项为:

但是有些调用实际上不会发生,结合函数的返回条件:

if(n == 0 && k == 0) return 1.0;
if(n<0 || k<0) return 0.0;

设我们传入的初始参数为n=N,k=K 则,可以得出已下结论:

  1. 当m=N+1且x=K+1时,满足程序退出的第一个条件;
  2. 当m>N+1或x>K+1时,满足程序退出的第二个条件(根据杨辉三角的性质,第m行有m项,所有此时有K+1<x<=m)

让我们看看满足以上结论的详细项:

  1.下列递归调用的x>K+1,满足结论2:

    •   m=K+2行的第K+2项:
    •   m=K+3行的第K+2项到K+3项:
    •   ……
    •   m=N+1行的第K+2项到最后一项:

  2.m=N+1行的第K+1项递归调用的第一个参数n和第二个参数k均为0,满足结论1。

  3.当m=N+2时,显然m>N+1,满足结论2;

如果调用参数满足函数退出条件,那么由调用的递归实际上就不会发生,数量为的系数✖️2。

N+2之后的递归都不会发生,所以做计算时只考虑到N+2层。N+2层的无效调用数量,为N+1层满足结论1或2的调用的数量*2,一次类推,直到K+3层的无效调用数量,为K+2层满足结论1或2的调用数量*2;K+2层到1层上,所有调用都有效;因为K+1层到1层,没有调用满足结论1或2.

根据杨辉三角的性质:从第1层到第N+2层所有的系数和为 

其中不会实际发生的调用次数为从(K+2层到N+1层):

化简之后为:

再次化简

所以最后程序递归调用的总次数为

运行随机验证几个组合,可以证明上述公式是正确的!

二项分布。计算binomial(100,50,0.25)将会产生的递归调用次数(算法第四版1.1.27)的更多相关文章

  1. 计算阶乘n!末尾0的个数

    一.问题描述 给定一个正整数n,请计算n的阶乘n!末尾所含有“0”的个数.例如: 5!=120,其末尾所含有的“0”的个数为1: 10!= 3628800,其末尾所含有的“0”的个数为2: 20!= ...

  2. python_计算1+……+100中偶数和

    如何计算1+--+100中偶数和? 1. 把奇数去掉,通过if,判断累加数除以2的余数,是否为1,判断是否是奇数 2. 通过continue 跳过对奇数的累加 #!/usr/bin/python3 d ...

  3. MathExam小学一二年级计算题生成器V1.0

    MathExam小学一二年级计算题生成器v1.0 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning ...

  4. pat1067. Sort with Swap(0,*) (25)

    1067. Sort with Swap(0,*) (25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue G ...

  5. Hadoop 系统配置 map 100% reduce 0%

    之前在本地配置了hadoop伪分布模式,hdfs用起来没问题,mapreduce的单机模式也没问题. 今天写了个程序,想在伪分布式上跑一下mapreduce,结果出现 map 100% reduce ...

  6. 【男性身材计算】胸围=身高*0.48(如:身高175cm的标准胸围=175cm*0.61=84cm);腰围=身高*0.47(如:身高175c… - 李峥 - 价值中国网

    [男性身材计算]胸围=身高*0.48(如:身高175cm的标准胸围=175cm*0.61=84cm):腰围=身高*0.47(如:身高175c- - 李峥 - 价值中国网 李峥:[男性身材计算]胸围=身 ...

  7. resin4.0.25 安装配置 及结合eclipse开发

    resin4.0.25 安装配置 及结合eclipse开发 本文大部分内容是对官网的翻译,及自己配置后的一些体会. 一.  基于win  ,resin基本安装1,安装jdk1.6或更高版本2,配置环境 ...

  8. linux系统更新rpm包问题 ,报错rhn-check-2.0.2-5.el7.noarch has missing requires of yum-rhn-plugin >= ('0', '1.6.4', '1')

    报错信息: rhn-check-2.0.2-5.el7.noarch has missing requires of yum-rhn-plugin >= ('0', '1.6.4', '1') ...

  9. wordcount程序出现map 100% reduce 0%问题的解决方法

    运行wordcount程序一直停在map 100% reduce 0%, input文件夹的内容: 其中: f1.txt中的内容为:hello hadoop f2.txt中的内容为:hello had ...

随机推荐

  1. ov5640 video capture时,vfe_v4l2.ko模块挂掉问题分析

    1.问题描述 在r16 tina平台,基于ov5640获取摄像头数据时,vfe_v4l2.ko模块挂掉. 2.配置信息 2.1上层应用设置的像素格式为V4L2_PIX_FMT_YUYV,分辨率为480 ...

  2. 认识rem

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. ReentrantReadWriteLock读写锁的使用<转>

    Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象.两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象. 读写锁:分为读 ...

  4. DRBD(Distributed Replicated Block Device) 分布式块设备复制 进行集群高可用方案

    DRBD是一个用软件实现的.无共享的.服务器之间镜像块设备内容的存储复制解决方案. 外文名 DRBD drbdadm 高级管理工具 drbdsetup 置装载进kernel的DRBD模块 drbdme ...

  5. 由于内部错误,服务器无法处理该请求。有关该错误的详细信息,请打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从 <serviceDebug> 配置行为)以便将异常信息发送回客户端,或打开对每个 Microsoft .NET Framework SDK 文档的跟踪并检查服务器跟踪日志。

    客户端调用WCF的时候报上面的错误,WCF只能序列化基础的数据类型,不能直接序列化SqlParameter类型,需要使用自定义类,然后在WCF服务端转换的方式解决: 自定义类代码如下: using S ...

  6. golang Time to String

    golang Time to String allenhaozi · 2016-09-02 09:00:00 · 2447 次点击 · 预计阅读时间 1 分钟 · 19分钟之前 开始浏览 这是一个创建 ...

  7. jQuery替换内容

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  8. 第二百八十节,MySQL数据库-外键链表之一对多,多对多

    MySQL数据库-外键链表之一对多,多对多 外键链表之一对多 外键链表:就是a表通过外键连接b表的主键,建立链表关系,需要注意的是a表外键字段类型,必须与要关联的b表的主键字段类型一致,否则无法创建索 ...

  9. ssh免密码登录的几个注意事项

    1, authorized_keys文件中每个公钥占一行,不能分成多行. 2,文件夹默认权限为600 3,如果遇到奇怪的问题,可以把.ssh/文件全部删掉,重新用ssh-keygen生成.

  10. sizeof 数组与指针

    在学习指针的时候,得到指针的定义和数组的定义一样,但是这时候就很好奇,指针只是一个地址,那数组和指针一样的话,sizeof时怎么得知其长度呢. 于是百度了下面的回复: 千万不要把数组名看成指针,尽管有 ...