- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法讲义:过程抽象
问题求解与程序设计第二讲 李文新 2005.2-6 课程网页及上机安排 /course/problemSolving/ 上机安排 周六??日 上午:8-10 10-12 ?? 分班 内容提要 1014题 一些观点和理念 递归过程 例题:采用牛顿法求平方根 练习:采用牛顿法求立方根 过程和它们所产生的计算 线性的递归和迭代 树形递归 练习:换零钱方式的统计 讨论:1163 讨论:1037 关于1014题 证明的总体思想 当某种价值k的珠宝的数目n足够多时,如果可分,一定可以找到一种分法,使得两边都有k,那么两边各去掉一个k,还是可分的。 即 如果其他价值的珠宝数目不变,如果价值为k的珠宝个数为n-2时可分,则为n时也可分;如果n-2时不可分,则为n时也不可分; 如此 n-2 再 –2,直到n不足够大,这些情况都是等价的。所以数目大时可以将其变小,结果不变。 关于1014题 需要注意的是,每次只能减少偶数个,所以简化以后,n的奇偶性不变。; 至于为什么一定可以找到两边都有价值k的分法,有定理帮我们找: 如果只有一边有价值k的珠宝,则一定可以找到另一边的某些珠宝的一种组合,其和十k的倍数m,此时就可以用另一边的组合换过m个k来,使得两边都有k, 为什么右边一定有足够多的珠宝能组合出mk来?因为我们在说n足够大的情况,如果它不足够大,我们就不要再把它缩小了, 关于1014题 足够大是如何丈量的?另一边有多于k块珠宝,就一定能组合出k的倍数来,不论这些珠宝的价值如何。 如何组合?假设k块珠宝的价值分别为a1,…,ak,考虑序列:0,a1,a1+a2,a1+a2+a3,…,a1+…ak,用这k+1个数模k,所的余数必定有两个相同,用后面一个减前面一个,得到的仍是a1,..,ak中某几个数的组合,而这个数模k等于0,这个组合就是我们要找的,与mk交换的珠宝。 这里a1,..,ak可以相同,也可以不同。 一些观点和理念 “计算机科学”并不是一种科学,而且其重要性也与计算机本身并无太大关系。计算机革命是有关我们如何去思考的方式,以及我们如何去表达自己的思考的一个革命。在这个变化里最基本的东西,就是出现了这样一种或许是最好是称为过程性认识论的现象 – 这就是如何从一种命令式的观点去研究知识的结构,这一观点是与经典数学领域中所采用的更具说明性的观点完全不同的。数学为精确处理“是什么”提供了一种框架,而计算则为精确处理“怎么做”的概念提供了一种框架。 一些观点和理念 心智的活动,除了尽力产生各种简单的认识之外,主要表现在如下三个方面:1)将若干简单认识组合为一个复合认识,由此产生出各种复杂的认识。2)将两个认识放在一起对照,不管它们如何简单或者复杂,在这样做时并不将它们合而为一。由此得到有关它们的相互关系的认识。3)将有关认识与那些在实际中和它们同在的所有其他认识隔离开,这就是抽象,所有具有普遍性的认识都是这样得到的。 一些观点和理念 一个强有力的程序设计语言,不仅是一种指挥计算机执行任务的方式,它还应该成为一种框架,使我们能够在其中组织自己有关计算过程的思想。这样,当我们描述一个语言时,就需要将注意力特别放在这一语言所提供的,能够将简单的认识组合起来形成更复杂认识的方法方面。 一些观点和理念 每种强有力的语言都为此提供了三种机制: 基本表达形式,用于表示语言所关心的最简单的个体。 组合的方法,通过它们可以从较简单的东西出发构造出复合的元素。 抽象的方法,通过它们可以为复合对象命名,并将它们当作单元去操作。 一些观点和理念 在程序设计中,我们需要处理两类要素:过程和数据(二者不是严格区分的)。非形式地说,数据是一种我们希望去操作的“东西”,而过程就是有关操作这些数据的规则的描述。这样,任何强有力的程序设计语言都必须能表述基本的数据和基本的过程,还需要提供对过程和数据进行组合和抽象的方法。 例题:采用牛顿法求平方根 给定一个正数x,如何计算x的平方根呢? 牛顿的逐步逼近法 对于x的平方根,给定一个猜测值y,则y与x/y的平均值是比y更好的一个猜测值,继续这一过程,会得到越来越好的猜测值。 例题:采用牛顿法求平方根 如何用过程语言表述这一计算过程? 初始条件:给定 x 和 猜测值 guess sqrt(guess,x){ if(goodEnough(guess,x)) return guess; return sqrt(improve(guess,x),x); } goodEnough(guess,x){ if(abs(guess*guess-x)threshold) return true; return false; } Improve(guess,x){ return (guess+x/guess)/
文档评论(0)