第十五章 代码复用与函数递归

代码复用与模块化设计

代码复用:把代码当成资源进行抽象

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)

运行结果如下图所示:

原文地址:https://www.cnblogs.com/chy8/p/9456320.html