夜光序言:
如果你越来越冷漠,你以为你成长了,但其实没有。长大应该是变得温柔,对全世界都温柔。
正文:函数和递归
函数和程序结构
函数可以简化程序,函数可以使程序模块化
用函数将较长的程序分割成短小的程序段,可以方便理解
程序例子:
将部分功能从程序中移出作为独立函数
星号绘制函数
星号数量计算函数
整体控制函数
夜光:完整程序可以写为。
整个程序可读性很强。使用函数的思想编写程序,可以大大增加程序的模块化程度
程序运行结果为:
递归的定义
递归:函数定义中使用函数自身的方法
经典例子:阶乘
n!= n(n-1)(n-2)...(1)
举例:5!=5(4)(3)(2)(1) =5 * 4!
推广: n!=n(n-1)! n! n(n1)(n2)...(1)
阶乘的递归定义:
0的阶乘:定义为1
其他数字:定义为这个数字乘以比这个数字小1的数的阶乘
递归不是循环
最后计算基例:0!。0!是已知值
递归定义特征 :
有一个或多个基例是不需要再次递归的;
所有的递归链都要以一个基例结尾
递归函数
通过一个累计器循环计算阶乘
阶乘的递归定义函数 :
运行递归函数fact()计算阶乘:
递归每次调用都会引起新函数的开始
递归有本地值的副本,包括该值的参数
阶乘递归函数中:每次函数调用中的相关n值在中途的递归链暂时存储,并在函数返回时使用。
5!的递归调用过程图
示例程序:字符串反转
Python列表有反转的内置方法
方法1:字符串转换为字符列表,反转列表,列表转换回字符串
方法2:递归
此问题的IPO模式:
输入:字符串
处理:用递归的方法反转字符串
输出:反转后的字符串
基本思想:把字符串看做递归对象
将字符串分割成首字符和剩余子字符串
反转了剩余部分后把首字符放到末尾,整个字符串反转就完成了
字符串反转算法(常犯错误版) :
此算法运行结果出错 :
构造递归函数,需要基例
基例不进行递归,否则递归就会无限循环执行
Python在900余次调用之后,到达默认的“递归深度的最大值”,终止调用
此递归调用以字符串形式执行,应设置基例为空串
正确的字符串反转代码(新版):
运行结果: