python3中递归算法的应用

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

patmos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值