python函数是实现代码复用的一种方式_Python电子教案设计5-2-函数和代码复用.ppt...

数学上有个经典的递归例子叫阶乘,阶乘通常定义为: 为了实现这个程序,可以通过一个简单的循环累积去计算阶乘。观察5!的计算,如果去掉了5,那么就剩下计算4!,推广来看,n!=n(n-1)!。 递归的定义 实际上,这个关系给出了另一种方式表达阶乘的方式: 这个定义说明0的阶乘按定义是1,其他数字的阶乘定义为这个数字乘以比这个数字小1数的阶乘。递归不是循环,因为每次递归都会计算比它更小数的阶乘,直到0!。0!是已知的值,被称作递归的基例。当递归到底了,就需要一个能直接算出值的表达式。 递归的定义 阶乘的例子揭示了递归的2个关键特征: (1)存在一个或多个基例,基例不需要再次递归,它是确定的表达式; (2)所有递归链要以一个或多个基例结尾。 递归的定义 微实例5.1:阶乘的计算 递归的使用方法 fact()函数在其定义内部引用了自身,形成了递归过程。 无限制的递归将耗尽计算资源,因此,需要设计基例使得递归逐层返回。fact()函数通过if语句给出了n为0时的基例,当n==0,fact()函数不再递归,返回数值1,如果n!=0,则通过递归返回n与n-1阶乘的乘积。 递归的使用方法 由于负数和小数通过减1无法到达递归的基例,即n==0,代码第7行通过abs()和int()函数将用户输入转变成非负整数,该程序输出效果如下: 递归的使用方法 >>>? 请输入一个整数: 10 3628800 >>>? 请输入一个整数: 12.345 479001600 递归遵循函数的语义,每次调用都会引起新函数的开始,表示它有本地变量值的副本,包括函数的参数。图5.13给出了计算5!的递归调用过程,每次函数调用时,函数参数的副本会临时存储,递归中的各函数在运算自己的参数,相互没有影响。当基例结束函数运算并返回值时,各函数逐层结束运算,向调用者返回计算结果。 递归的使用方法 递归的使用方法 对于用户输入的字符串s,输出反转后的字符串。 解决这个问题的基本思想是把字符串看作一个递归对象。长字符串由较短字符串组成,每个小字符串也是一个对象。假如把一个字符串看成仅有两部分组成:首字符和剩余字符串。如果将剩余字符串与首字符交换,就完成了反转整个字符串,代码如下。 def reverse(s): return reverse(s[1:]) + s[0] 微实例5.2:字符串反转 观察这个函数的工作过程。s[0]是首字符,s[1:]是剩余字符串,将它们反向连接,可以得到反转字符串。执行这个程序,结果如下: 递归的使用方法 这个错误表明系统无法执行reverse()函数创建的递归,这因为reverse()函数没有基例,递归层数超过了系统允许的最大递归深度。默认情况下,当递归调用到1000层,Python解释器将终止程序。 递归深度是为了防止无限递归错误而设计,当用户编写的正确递归程序需要超过1000层时,可以通过如下代码设定。 递归的使用方法 >>>import sys >>>sys.setrecursionlimit(2000) #2000是新的递归层数 reverse()超过递归深度是因为没有设计基例。字符串反转中的递归调用总是使用比之前更短的字符串,因此,可以把基例设计为字符串的最短形式,即空字符串。 递归的使用方法 实例5.2的完整代码和结果 微实例5.2的结果 >>>? 请输入一个字符串: 唐诗宋词 词宋诗唐 科赫曲线绘制 七段数码管绘制 数码管是一种价格便宜、使用简单的发光电子器件,广泛应用在价格较低的电子类产品中,其中,七段数码管最为常用。七段数码管(seven-segment indicator)由7段数码管拼接而成,每段有亮或不亮两种情况,改进型的七段数码管还包括一个小数点位置,如图5.4所示。 七段数码管绘制 七段数码管绘制 七段数码管能形成27=128种不同状态,其中部分状态能够显示易于人们理解的数字或字母含义,因此被广泛使用。图5.5给出了十六进制中16个字符的七段数码管表示。 七段数码管绘制 本节将延续实例2和第2.4节内容,通过部分turtle库函数绘制七段数码管形式的日期信息。该问题的IPO描述如下: 输入:当前日期的数字形式 处理:根据每个数字绘制七段数码管表示 输出:绘制当前日期的七段数码管表示 七段数码管绘制 每个0到9的数字都有相同的七段数码管样式,因此,可以通过设计函数复用数字的绘制过程。进一步,每个七段数码管包括7个数码管样式,除了数码管位置不同外,绘制风格一致,也可以通过函数复用单个数码段的绘制过程。这里,先给出程序的全部代码,实例代码7.1如下 七段数码管绘制 实例代码7.1定义了drawDigit()函数,该函数根据输入的数字d绘制七段数码管,结合七段数码管结构,每个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值