Python-如何实现函数的递归操作-旧时光 oldtimeblog

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
小结:
这些是方便解释的例子,实际操作可能会碰到很多复制的情况进行判断,但不管怎样,一定要有终止调用自身的条件。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值