不断的对于某操作重复调用执行称为递归调用,递归函数执行的这个过程中只有进栈(开辟空间),没有出栈,直到最后一次调用完毕了,才逐个出栈,所以递归函数在执行的时候非常的占用内存资源;如果执行的次数过多了,会产生内存溢出的现象;所以一定要控制递归的层数,当符合某一条件时要终止递归调用,几乎所有的递归都能用while循环来代替;所以对于递归要慎用!!!

递归函数:在某个函数中,调用其本身(函数自己调用自己),这个函数整体我们称为递归函数。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

如何定义递归函数?(先假设此函数已经实现)

考虑切入点:(1).寻找一个临界点(结束点);(2).本次的函数执行不能满足最终的整体需求,所以还需要再次的去调用此函数;(找到后者和前者之间的关系,体现:后者的调用结束会将前者需要的数据返回回来)

优点:递归可以把问题简单化,让思路使为清淅,代码更简洁。缺点:递归因系统环境影响大,当递归深度太大时,可能会得到不可预知的结果。

演示递归函数调用自身:

 1 # 直接调用自身:
 2 def f():
 3   f()
 4 
 5 f()
1 # 间接调用自身:
2 def fa():
3   fb()
4 def fb():
5   fa()
6  
7 fa()

代码演示示例:

 1 # 递归求和:0 + 1 + 2 + 3 + 4 + ..... + n 的和
 2 def mysum(n):
 3     if n == 0:
 4         return 0
 5   return n + mysum(n-1)
 6 
 7 print(mysum(100)) # 5050
 8 print(mysum(998)) # 没错 ,是临界点,再大就会溢出
 9 print(mysum(1000)) # 程序崩溃(递归的弊端)
10 
11 
12 # 计算1~5的阶乘
13 def jiechen(num):
14     if num == 1:
15         return 1
16     return num * jiechen(num - 1)
17 
18 print(jiechen(5))
19 
20 
21 # 遍历某个路径下面的所有内容(文件和目录,考虑多级的情况)
22 import os
23 # 自定义函数(递归函数):遍历目录层级(多层)
24 def printDirs(path):
25     dirs = os.listdir(path)
26     # 循环处理此列表
27     for d in dirs:
28         # 组装d得到其绝对路径形式
29         fileAbsPath = os.path.join(path,d)
30         # 判断是目录还是文件
31         # 如果是文件直接打印即可,如果是目录打印完毕后再次调用此函数
32         if os.path.isfile(fileAbsPath):
33             print(d)
34         elif os.path.isdir(fileAbsPath):
35             print(d)
36  printDirs(fileAbsPath)
37 path = r'C:\Users\Administrator\Desktop\a'
38 printDirs(path)

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄