python-裘宗燕-第三章.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文档。上传文档
查看更多
从问题到程序(Python程序设计) 裘宗燕,2017//-*- 基本编程技术-2 递归与循环 计算Fibonacci的函数 函数运行时间 求最大公约数 两个递归函数实例 河内塔问题,换硬币问题 简单递归和相互递归 程序终止性 Fibonacci 序列(递归程序示例) Fibonacci(斐波那契)序列是一个重要的整数序列 因意大利数学家而斐波那契(1175-1250)命名,最早源于印度 有大量数学结果,在计算领域有许多特别重要的应用 Fibonacci 序列的定义 F0 = 0, F1 = 1 (基础情况) Fn = Fn-1 + Fn-2, 对所有 n 1(一般情况) 序列的前几项:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...... Fibonacci 序列的定义是递归定义 基础情况,一般情况可归结到更简单情况(下标更小) 可以直接做出一个递归定义的函数 函数定义和计算试验(用38、39、40等实验) 计算的时间 函数 fib 的定义很好,与数学定义直接对应,简单、易理解 但也不好:计算要花费很长时间(计算fib(100)需要百万年) 现在的计算机非常快,但计算也要花时间 有些程序的计算可能花很长时间 解决某些复杂问题的程序必然需要非常长的时间 看计算 fib(5) 的情况 存在大量重复计算 计算有代价 实际计算由现实世界中的设备(目前是电子计算机)完成 不是数学,不是抽象的理论 每步计算都有代价,即使非常小但也不为 0,累积起来就可能超过给定的任意大的数(这是数学) 有代价是计算的一种本质特征,相关理论问题后面讨论 一些情况: 可能存在从理论上看能用计算机解决的问题,但我们不可能等到计算机给出解的那个时间 编程时需要考虑计算的时间,寻找解决问题的高效方法(算法)永远有意义 有些实际问题对计算完成的时间非常敏感 例:ABS/EBD(电子制动分配)系统,天气预报系统等 为计算计时 统计程序或程序片段的计算时间,有助于理解程序的性质,实际中常需要做。现在介绍Python标准库的计时功能 标准库包time提供了计时函数time,调用它得到从1970年1月1日开始的秒数。两次调用time就能为一段计算计时。例如: from time import time def test_fib(n): t = time() f = fib(n) print(Fib[ + str(n) + ] =, f, Timing:, str(time() - t) + s\n) 函数的输出计算 fib(n) 的时间 如果发现一个程序很慢,不能满足实际需要,可能做的一件事就是仔细检查程序,估计其中各部分的时间开销,设法改进 再看 Fibonacci 序列:另一种算法 对 Fibonacci 数的计算,换一种看法: 基本情况已直接给定,由 Fn-1 和 Fn 可以递推得到 Fn+1 考虑定义一个基于递推循环的函数,从 F0 和 F1 出发,一步步向前递推,直至得到所需要的 Fn 考虑循环中的变量安排: 用 f1 和 f2 记录已知的两个相邻 Fibonacci 值 f1 + f2 是下一个 Fib 值 需要知道算到第几个 Fib 值,k 记录变量 f1 的值是 Fk f1, f2 和 k 需要在每次循环中更新 f1, f2 = f2, f1+f2 k += 1 也可以用递归函数描述这种计算 存在更快的算法 循环不变式 怎么确定下面循环能算出正确的结果? f1, f2 = 0, 1 # 开始时分别表示F_0和F_1 k = 0 while k n: f1, f2 = f2, f2 + f1 k += 1 return f1 需要论证一旦k增加到n,f1的值就是第n个Fibonacci数 我们说明循环保证:每次条件判断时,f1总是第k个Fibonacci数,f2总是第k+1个数。这样当k值等于n时f1就是所需结果 在循环中总能保证的变量之间的关系,称为循环不变式 循环不变式是证明循环功能正确的基本工具 新函数效率高,但论证其正确性则不容易(有得有失) 求最大公约数 考虑求最大公约数的问题。定义:两个数 m 和 n 的最大公约数,就是既能整除 m 又能整除 n 的最大的正整数 最简单而直接的想法是用一系列的正整数试验 一种考虑 从 1 开始试,1 总可以整除 m 和 n 递增,发现同时为 m 和 n 约数时记录它 试到超过 m 和 n 中较小的一个,就可以结束 记录的最大的那个约数,就是 m 和 n 的最大公约数 假定 m = 0, n 0,容易写出函数定义 如果允许参数是任何整数(包括负数),需要加一些前处理 求

文档评论(0)

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

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

1亿VIP精品文档

相关文档