1.函数实现递归的条件
1
一个函数在它的内部引用自身,并在一定条件下停止函数的调用。这就会实现一个递归的过程。
第一个条件是函数内部引用自身。引用自身会发生什么情况:
旧时光 oldtimeblog
示例:
def myFun(a):
print(a)
a+=1
myFun(a)
myFun(1)
RecursionError: maximum recursion depth exceeded while calling a Python object
递归错误:调用python对象时超过了最大递归深度
Python-如何实现函数的递归操作 旧时光 oldtimeblog
2
上例中超过了递归的最大深度而终止运行;可以通过sys模块来查看最大深度,并能更改这个深度值。
例如:
import sys
print(‘修改前深度:’,sys.getrecursionlimit())
—修改前深度: 1000
sys.setrecursionlimit(2000)
print(‘修改后深度:’,sys.getrecursionlimit())
—修改后深度: 2000
Python-如何实现函数的递归操作
3
第二个条件,停止函数的调用,就是递归的出口。例如return就可以作为一个出口。
例如:把上面的例子在调用自身前加个条件返回就可以了;
def myFun(a):
print(a)
if a==5:
return
a+=1
myFun(a)
myFun(1)
Python-如何实现函数的递归操作
END
2.递归运行的过程。
1
用例子来说明:从1到某个整数之间的所有整数和。
def addNum(a):
if a==1:
return 1
return (a+addNum(a-1))
print(addNum(3))
Python-如何实现函数的递归操作
2
以上面的函数为例,用debug来看看递归运行的轨迹:
有一点必须搞清楚,函数return的返回值,是返回到调用函数的地方。
0pycharm如何使用debug工具
Python-如何实现函数的递归操作
END
3.递归和for循环:
例如要从一个文件夹下,搜索出所有txt文件。那么就要对每一层的文件夹遍历,就要写与文件层一样多的嵌套。
例如图片中的文件夹F:\test。要获得它下面的所有txt文件:看下面的例子。
(注:例子仅仅是为了说明问题。)
Python-如何实现函数的递归操作
首先用for循环来层层遍历进行搜索:
例如:
import o
myDir = ‘F:\test
for i in os.listdir(myDir):
fPath = os.path.join(myDir,i)
if os.path.isfile(fPath) and fPath.endswith(’.txt’):
print(fPath)
elif os.path.isdir(fPath):
for i in os.listdir(fPath):
fPath1 = os.path.join(fPath,i)
if os.path.isfile(fPath1) and fPath1.endswith(’.txt’):
print(fPath1)
输出:
F:\test\aa.txt
F:\test\bb.txt
F:\test\no1-1\cc.txt
F:\test\no1-2\hh.txt
这是遍历了两层,如果有十层八层,就混乱了。这种情况要考虑递归写法。
Python-如何实现函数的递归操作
在写循环嵌套的时,如果每次嵌套的作用都一样,可以试试用递归的方法:
上例用递归来搜索文件:
def getFile(myDir):
for i in os.listdir(myDir):
fPath = os.path.join(myDir, i)
#print(fPath)
if os.path.isfile(fPath) and fPath.endswith(’.txt’):
print(fPath)
elif os.path.isdir(fPath):
getFile(fPath)
return
getFile(‘F:\test’)
1)每次循环符合条件就输出文件(或删除,和复制,或重命名),碰到文件夹就调用自身,直到将所有的文件遍历完。
2)在循环体内调用自身,所以它的出口在就在for循环,循环结束,递归就结束了。
仅用了一个循环就能遍历出一个文件夹下所有的想要的文件。只要不超出你设置的递归深度,多少层都可以。
Python-如何实现函数的递归操作
END
小结:
这些是方便解释的例子,实际操作可能会碰到很多复制的情况进行判断,但不管怎样,一定要有终止调用自身的条件。