算法第四版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. dubbo接口测试

    1.下载所需工具eclipse或intellij idea,下载maven,maven中config/settings.xml中要添加公司(测试人员公司)的maven库,不然被测dubbo服务jar包 ...

  2. jquery 悬浮验证框架 jQuery Validation Engine

    中文api 地址  http://code.ciaoca.com/jquery/validation-engine/   和bootstarp 一起使用不会像easyui  验证那样生硬 修改版 原版 ...

  3. FileInputStream与FileOutputStream类

    FileInputStream和FileOutputStream类分别用来创建磁盘文件的输入流和输出流对象,通过它们的构造函数来指定文件路径和文件名. 创建FileInputStream实例对象时,指 ...

  4. JSON特殊字符的处理

    本文转自:http://blog.csdn.net/btt2013/article/details/66970735 JSon 数据中的String 传递数据时,需要处理好特殊字符. JSon数据中有 ...

  5. Oracle复习(有记录才能沉淀.......)

    一.Oracle准备工作 1.安装Oracle Oracle数据库产品是免费的,我们可以从Oracle的官方网站(http://www.oracle.com)下载到程序安装包,Oracle在Windo ...

  6. scala flatMap reduceLeft foldLeft

    object collection_t1 { def flatMap1(): Unit = { val li = List(,,) val res = li.flatMap(x => x mat ...

  7. C语言 · 数组查找及替换

    算法训练 数组查找及替换   时间限制:1.0s   内存限制:512.0MB      问题描述 给定某整数数组和某一整数b.要求删除数组中可以被b整除的所有元素,同时将该数组各元素按从小到大排序. ...

  8. RSYNC在zabbix中的检查

      RSYNC在zabbix中的检查 作者:高波 归档:学习笔记 2017/08/21 快捷键: Ctrl + 1    标题1 Ctrl + 2    标题2 Ctrl + 3    标题3 Ctr ...

  9. 数学 - SGU 118. Digital Root

    Digital Root Problem's Link Mean: 定义f(n)为n各位数字之和,如果n是各位数,则n个数根是f(n),否则为f(n)的数根. 现在给出n个Ai,求出A1*A2*…*A ...

  10. Generator生成器函数

    接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还有一种常用的解决方案,它就是Ge ...