python3中递归算法的应用
递归算法解决问题的特点:
(1)递归就是在过程或函数里调用自身
(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低,所以一般不提倡用递归算法设计程序。
(4)在递归调用的过程中系统为每一层的返回点、局部量等开辟了栈来存储,递归次数过多容易造成栈溢出等。
递归的要求
递归算法所体现的“重复”一般有三个要求:
(1)每次调用在规模上都有所缩小(通常是减半)
(2)是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出作为后一次的输入)
(3)在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模位达到直接解答的大小为条件)无条件递归调用将会成为死循环而不能正常结束。
import os
import csv
class ReaderScript:
def __init__(self, path):
self.count = 0
self._scripts = self.__reader__(path)
# 递归算法
# 用于读取测试脚本,返回值就是脚本行的列表
def __reader__(self, path):
# 检查传入的文件不存在以及传入的不是文件的情况
if not os.path.exists(path) or os.path.isdir(path):
return None
# 计数器用于记录当前是递归的第几层
self.count += 1
# 读取脚本文件
with open(path, 'r', encoding='utf8') as f:
reader = csv.reader(f)
if self.count == 1:
# 只有当首次递归时才去获取测试的模块名,和测试用例的标题
self._module, self._title = reader.__next__()
else:
# 非首次递归,就只跳过标题行
reader.__next__()
scripts = []
for line in reader:
# 提取脚本行中首项,用于判断是否要做递归
first_item = line[0]
# 检查首项是否是另外一个脚本文件
if first_item.endswith('.txt'):
# 拼接嵌套的脚本文件的路径
sub_testcase = os.path.join(os.path.dirname(path), first_item)
# 读取嵌套的脚本文件
sub_scripts = self.__reader__(sub_testcase)
# 把读取的嵌套脚本结果列表合并到主脚本中
scripts.extend(sub_scripts)
else:
# 将本次递归的脚本行添加到脚本列表中
scripts.append(line)
return scripts