函数递归
函数递归
函数递归(爬虫用的比较多)
- 指的是重复 "直接调用或间接调用" 函数本身,这是一种函数嵌套调用的表现形式
函数递归有两种调用方式:
1、直接调用:在函数内置,直接调用函数本身
# 直接调用 num = 1 def func(): global num print("from func", num) num += 1 func()
func()
2、间接调用:两个函数之间相互调用简介造成递归
# 间接调用 def foo(): print("from goo") goo() def goo(): print("from goo") foo() foo()
# 单纯的递归是没有意义的
若递归有意义,必须遵循两个条件:
1、递推:
指的是重复地执行,每一次执行都要拿到一个更接近于结果的结果,递推必须要有一个终止条件。
2、回溯:
当递推找到一个终止条件后,开始一步一步往上回溯
例:第一个人年龄为18,第二个人年龄比第一个人大2岁,第二个人比第二个人大2岁,求第五个人多少岁
""" 例:第一个人年龄为18,第二个人年龄比第一个人大2岁,第二个人比第二个人大2岁,求第五个人多少岁 age5 == age4 + 2 age4 == age3 + 2 age3 == age2 + 2 age2 == age1 + 2 age1 == 18 # ★递推终止的结果 # age(n) = age(n - 1) + 2 """ # 定义一个函数age,变量n为第几个人 def age(n): # 当n=1时,返回一个值18:“回溯”到第一个人时,第一个人年龄为18。 ★此处为程序结束的终止点 if n == 1: return 18 # 返回前一个人的年龄,传递给age()函数,继续向前“回溯”,即继续执行程序 return age(n - 1) + 2 res = age(5) print(res)
图解:
递归深度
相关知识(了解):
python中有默认的递归深度:998
函数递归在重复调用函数的过程中,会形成死循环,python为了节省资源,防止系统资源使用过度导致死机,所以对递归深度进行限制。但深度可以修改,见下文。
ps:每一台操作系统中都会根据硬件来设置默认递归深度
获取递归深度:
import sys # 获取操作系统资源的模块 print(sys.getrecursionlimit())
设置递归深度:
import sys sys.setrecursionlimit(1000) #括号内数字可手动修改深度值
查看当前可以承受的递归深度(写一个递归函数,报错处即是):
num = 1 def func(): global num print("from func", num) num += 1 func() func()