一、递归的定义
函数作为一种代码的封装,在定义是可以直接或间接的调用其他函数,也可以被其他程序内部代码调用。若函数内部调用了本身,则这个函数称之为递归函数
递归函数在定义时需要满足两个基本条件,一个是递归公式,另一个是边界条件。其中递归公式是求解原问题或相似子问题的结构,边界条件是最小化的子问题,也是递归终止的条件。
递归函数的执行可以分为以下两个阶段:
(1)递推:递归本次的执行都基于上一次的运算结果。
(2)回溯:遇到终止条件时,则沿着递归递推往回一级一级地把值返回来。
递归函数定义格式:
def 函数名([参数列表])
if 边界条件:
return 结构
else:
return 递归公式
以正整数n!为例,当n=1时所得结果为1,当n>1时所得结果为n×(n-1)!。利用递归求解阶乘时n=1时边界条件,n×(n-1)!是递归公式。
def fact(num):
if num==1:
return 1
else:
return num*fact(num-1)
num=int(input("请输入一个数:"))
result=fact(num)
print(f"{num}!=%d"%result)
运行结果:
递归逻辑:
fact() 函数在其定义内部引用了滋生,形成了递归过程。无限制的递归则会耗尽计算资源,因此,在设计是应该通过设计基例使得递归逐层返回。fact()函数通过if语句给出了n为0时的基例,当n==0时fact()函数不在递归返回值为1,如果n!=0,则通过递归返回n与n-1结乘的乘积。
递归遵顼函数的语意,每次调用都会引起新的函数开始,表示它有本地变量值的副本,包括函数的参数,以计算5!的递归为例,每次函数调用时,函数参数副本会临时存储,递归中各个函数再运算自己的参数,互相没有影响,当基例结束运算并返回值时,各个函数逐层结束运算向调用返回计算结果。
实例:采用递归的方法绘制科赫曲线
正整数n代表科赫曲面的结束表示生成科赫曲线的操作次数。科赫曲线初始化阶数为0,表示应该长度为L的直线,对于直线L,将其分为三段,中间一段用边长为L/3的等边三角形的两个变替代,以此往复。
示例代码:
import turtle
def koch(size, n):
if n == 0:
turtle.fd(size)
else:
for angle in [0, 60, -120, 60]:
turtle.left(angle)
koch(size/3, n-1)
def main():
turtle.setup(600,600)
turtle.speed(100)
turtle.penup()
turtle.goto(-200, 100)
turtle.pendown()
turtle.pensize(2)
level = 5 #5阶科赫雪花,阶数
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.right(120)
turtle.hideturtle()
main()