基本程序设计技术.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基本程序设计技术 但这个定义有一个本质性缺点。示意图: 存在大量重复计算,参数越大重复计算越多。 有关系吗? 随着参数增大,计算中重复增长迅速,最快的微机上一分钟大约可以算出fib(45)。 参数加1,fib多用近一倍时间(指数增长)。最快的微机一小时算不出fib(55),算fib(100) 要数万年。 计算需时间,复杂计算需要很长时间。这是计算机的本质特征/弱点。说明它不万能,有些事情“不能”做。 求Fibonacci 值有更好计算办法(下面介绍)。 人们发现了许多实际问题,理论上说可用计算机解决(可写出计算它的程序),但对规模大的情况(“大的参数 n”),人类永远等不到计算完成。 这时能说问题解决了吗? 理解这个情况对于理解计算机是非常重要的。 这里有一大类问题称为计算中的“难解问题”,其中有许多很实际的问题(规划、调度、优化等)。 这方面的理论和实际技术的研究极为重要:计算复杂性,难解问题,“P = NP?”问题。 另外,对于许多问题的实用的有效算法,有极大的理论价值和实际价值。 为计算过程计时 统计程序/程序片段的计算时间有助于理解程序性质。许多语言或系统都提供了内部计时功能。 有关函数在time.h,统计程序时间时程序头部应写:     #include time.h 在程序里计时,通常写表达式:     clock()/CLOCKS_PER_SEC 得到从程序开始到表达式求值时所经历的秒数。 确定计算fib(45)所需要的时间的程序: #include stdio.h #include time.h long fib (int n) { return n=1 ? 1 : fib(n-1)+fib(n-2); } int main () {/* 自己做其他试验 */ double x; x = clock(); fib(45); x = (clock() – x) / CLOCKS_PER_SEC; printf(Timing fib(45): %f.\n, x); return 0; } Fibonacci数的递推计算 易见 1)F1和F2是1;2)知道连续两个Fibonacci数,就可算出下一个。 递推计算方式:逐个前推,可用循环实现。 long fib1 (int n) { long a = 1, b = 1, c, i; if (n = 1) return 1; for (c = a+b, i = 2; i n; ++i) { a = b; b = c; c = a + b; } return c; } /* 对吗? */ 循环里:i等于n时c的值应是第n个Fib数。这要求每次判断时c的值正是第i个Fib数。循环要保证这种关系。 循环实现重复性计算,循环体可能执行多次。如何保证对各种数据都能正确完成计算? 循环中变量不断变化。写循环要考虑变量间的关系,保证某些关系在循环中不变:循环的不变关系。 写循环时最重要的就是想清循环中应维持变量间的什么关系才能保证循环结束时变量能处在所需状态。写完循环后应仔细检查是否满足要求。 循环不变关系(循环不变量)是理解循环、写好循环的关键。这个方面有很多研究,有许多理论结果。 问题:用循环的函数比用递归定义的好吗? 新函数在计算时间上有极大优越性。计算时间由循环次数确定。循环体执行次数大致为n。对fib(100)只需约100次循环,几乎察觉不到所花费时间。 新函数定义较复杂,有复杂的循环。要理解程序意义,确认函数对任何参数都算出Fibonacci值,需要借助“循环不变关系”的概念和细致分析。 上面分析中没考虑数据表示范围,long类型一般无法表示fib(100)。 注意:这个例子并不是说明递归比循环的效率低。完全可以写出计算fib的同样高效的递归函数。 求最大公约数(greatest common divisor,GCD): 写函数 long gcd(long, long) 方式1:k取初值1后递增,大于m或n之一时结束。 如何得到所需结果? m和n可能有多个公约数,最后的k值不是m和n的公约数(它已大于两数之一)。 解法1:逐个检查,直到找到能同时整除m和n的最大整数(生成与检查)。需辅助变量k记录检查值。简单方式:k顺序取值(初值/更新/结束),可用循环实现。 需要记录循环中找到的公约数。 只需记录已找到最大的公约数,用变量d,初值1(是公约数),遇到新公约数(一定更大)时记入d: if (m % k == 0 n % k == 0) d = k; /* k为新找到的公约数 */ 有了d及其初值,k可以从2开始循环。函数定义: long gcd (long

文档评论(0)

seunk + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档