不断的对于某操作重复调用执行称为递归调用,递归函数执行的这个过程中只有进栈(开辟空间),没有出栈,直到最后一次调用完毕了,才逐个出栈,所以递归函数在执行的时候非常的占用内存资源;如果执行的次数过多了,会产生内存溢出的现象;所以一定要控制递归的层数,当符合某一条件时要终止递归调用,几乎所有的递归都能用while循环来代替;所以对于递归要慎用!!!
递归函数:在某个函数中,调用其本身(函数自己调用自己),这个函数整体我们称为递归函数。
如何定义递归函数?(先假设此函数已经实现)
考虑切入点:(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)
来源:https://www.cnblogs.com/bonheur/p/12387349.html