【Python】代码复用与函数递归
把代码当成一种资源,
代码资源化:程序代码是一种用来表达计算的资源;
代码抽象化:使用函数等方法对代码赋予更高级别的定义;
代码复用:同一份代码在需要时可以被重复使用。
函数和对象是代码复用的两种表现形式,函数将代码命名,在代码层面建立了初步的抽象。
模块化设计:通过函数或对象封装将程序划分为模块及模块间的表达。具体包括:主程序,子程序和子程序之间的关系。
紧耦合:两个部分之间的交流很多,无法独立存在;
松耦合:两个部分之间交流较少,可以独立存在。
模块内部紧耦合,模块之间松耦合。
函数递归
函数递归不仅仅在程序中,数学中也学习过,递归中有两个关键的特征:链条和基例。
基例就是最基础的那个条件;
链条是n和n-1之间满足的条件。
数学归纳法
证明当n取第一个值n(0)时命题成立,
假设当n(k)时命题成立,证明当n=n(k+1)命题也成立,
递归是数学归纳法思维的编程体验。
看下例子:
看代码:
递归本身就是一个函数,需要用函数定义方式描述,函数内部需要区分哪些是基例哪些是链条,基例和链条分别对应代码。
当n=5,fact(5)=5*fact(4)
这时计算机会分配内存去计算fact(4)
然后一直往下 fact(3) 、fact(2)、 fact(1)
fact(1)=1*fact(0)
fact(0)=1
然后结果不断的返回 得到fact(5)。
根据函数的定义,我们可以把定义理解为模板。计算机在进行运算时,会对模板进行循环往复的运算。
函数递归实例解析
字符串的反转,将字符串S反转后输出,之前学习过字符串的切片,s[::-1]可以实现字符串的反转。意思是采用-1的步长进行输出。看递归的实现,函数+分支结构,区分递归链条和递归基例。
很简单吧,再看一个例子,斐波那契数列
F(1)=1
F(2)=1
F(3)=F(1)+F(2)
F(n)=F(n-1)+F(n-2)
看程序:
再看一个稍微复杂的实例,汉诺塔问题 。汉诺塔指的是。。。(槽,自己去搜)。
A B C 代表三个柱子 汉诺塔默认在A柱子上。
从A搬到C,小圆盘一直在大圆盘上面。
n代表层数,上面是四层汉诺塔的解决问题。scr是源柱子,dst是目标柱子,mid是中间柱子。