代码复用
函数和对象是代码复用的两种主要形式
函数:将代码命名 在代码层面建立了初步抽象 |
对象:属性和方法 在函数之上再次组织进行抽象 |
分而治之
通过函数和对象封装将程序划分为模块及模块间的表达 |
我们要清楚主程序、子程序和子程序之间的关系 |
一般将子程序看作模块,主程序看作模块与模块之间的关系 |
分而治之的思想是模块化设计的核心 |
分而治之:一种分而治之、分层抽象、体系化的设计思想 |
模块设计
紧耦合:两个部分之间的交流很多,无法独立存在 |
松耦合:两个部分之间的交流很少,可以独立存在 |
模块内部紧耦合,模块之间松耦合 |
函数递归
调用函数自身的方式就是递归,递归有两个关键特征 |
链条:计算过程存在递归链条 |
基例:存在一个或多个不需要再次递归的基例 |
这两种关键特征就构成了递归的定义 |
n!(n的阶乘 )
定义值 n! 在n=0是为1,这就是一种基例
它与其他的值之间并不存在递归关系
它已经是递归的最末端
递归是数学归纳法思维的编程体现
函数递归的调用过程
#递归的实现为 :函数+分支语句 递归本身是一个函数,需要函数定义方式描述
#函数内部,采用分支语句对输入参数进行判断,基例和链条,分别编写对应代码
#递归的调用过程事实上就是函数的计算机运算过程
def fact(n):
if n==0:
return 1
else:
return n*fact(n-1)
a=fact(5) #递归调用
print(a)
小例子1:字符串的反转
#将字符串s反转后输出
#方法一:我们可以使用字符串的切片方式进行反转 s[::-1]
#方法二:使用递归方式实现字符串反转
#函数+分支结构(区分递归链条和递归基例)
def rvs(s):
if s=="": #字符串s的最小形式是空字符串,它的反转就是它自己
return s
else:
return rvs(s[1:])+s[0]#将首字符放到其余字符的最后(我不理解)
print(rvs("012345"))
说实话字符串切片我还不是很理解
尤其是放到实例中呜呜呜呜
小例子2:斐波那契数列
#函数+分支结构 递归链条 递归基例
#斐波那契数列中有两个基例 当n=1、n=2的时候 它的返回值都是1
def f(n):
if n==1 or n==2:
return 1
else:
return f(n-1)+f(n-2)
print(f(5))
小例子3:汉诺塔问题
count=0
def hnt(n,first,last,mid): #第一个参数代表n个圆盘,第二个参数代表源柱子,第三个参数代表目标柱子,第四个参数代表中间过渡柱子
global count
if n==1:
print("{}:{}->{}".format(1,first,last))
count+=1
else:
hnt(n-1,first,mid,last)
print("{}:{}->{}".format(n,first,last))
count+=1
hnt(n-1,mid,last,first)
hnt(3,"A","C","B")
print(count)
实例对现阶段的我来讲
还有一点看不懂呜呜呜
要努力呦!!!