第十五章 代码复用与函数递归
代码复用与模块化设计
代码复用:把代码当成资源进行抽象
1、代码资源化:程序代码是一种用来表达计算的“资源”
2、代码抽象化:使用函数等方法对代码赋予更高级别的定义
3、代码复用:同一份代码在需要时可以被重复使用
代码复用:函数和对象是代码复用的两种主要形式
函数:将代码命名在代码层面建立了初步抽象
对象:属性和方法<a>.<b>和<a>.<b>()在函数之上再次组织进行抽象
模块化设计:分而治之
1、通过函数或对象封装将程序划分为模块及模块间的表达
2、具体包括:主函数、子函数、子程序之间的关系
3、分而治之:一种分而治之、分层抽象、体系化的设计思想
模块化设计:
紧耦合 松耦合
紧耦合:两个部分之间交流很多,无法独立存在
松耦合:两个部分之间交流较少,可以独立存在
模块内部紧耦合、模块之间松耦合
递归的定义:函数定义中调用函数自身的方式
递归的关键特征:
链条:计算过程存在递归链条
基例:存在一个或多个不需要再次递归的基例
类似于数学归纳法:
what is 数学归纳法呐?
数学归纳法:
1、证明当n取第一个值n0时命题成立
2、假设当nk时命题成立,证明当nk=nk+1时命题也成立
递归思想也是数学归纳法思维的编程体现
递归的实现:
函数+分支语句
1、递归本身是一个函数,需要函数定义方式描述
2、函数内部,采用分支语句对输入参数进行判断
3、基例和链条,分别编写对应的代码
实例一:阶乘
1 def fact(n): 2 if n==0: 3 return 1 4 else: 5 return n*fact(n-1)
实例二:字符串反转
将字符串s反转后输出>>>s[::-1]
1 def rvs(s): 2 3 if s=="": 4 return s 5 else: 6 return rvs(s[1:])+s[0]
实例三:斐波那契数列:
1 def f(n): 2 if n==1 or n==2: 3 return 1 4 else: 5 return f(n-1)+f(n-2)
实例四:汉诺塔
count=0 def hanoi(n,src,dst,mid): global count if n==1: print("{}:{}->{}".format(1,src,dst)) count+=1 else: hanoi(n-1,src,mid,dst) print("{}:{}->{}".format(n,src,dst)) count+=1 hanoi(n-1,mid,dst,src) hanoi(3,"A","C","B") print(count)
运行结果如下图所示: