如何将统计文本特定单词的Python函数改写为递归实现?
递归实现文档行计数的修正方案
原递归代码的问题
- 未从传入的
lst中获取当前要检查的行,导致line变量未定义 - 每次调用函数都重置
count = 0,直接丢失之前的计数 - 递归逻辑冲突,同时手动维护
count和返回1 + 递归结果,造成重复计数
修正后的递归实现
方式一:基于索引的高效递归
这种方式无需创建新列表,性能更优:
def count_words_r(self, word, index=0): # 递归终止条件:索引超出列表范围,返回0 if index >= len(self.lst): return 0 # 检查当前行是否包含目标单词 current_line = self.lst[index] match = 1 if word.lower() in current_line.lower() else 0 # 递归检查下一行,累加结果 return match + self.count_words_r(word, index + 1)
调用示例:doc.count_words_r("your_target_word")
方式二:基于列表切片的直观递归
逻辑更易理解,但每次切片会生成新列表,大数据量下效率稍低:
def count_words_r(self, word, lst=None): # 首次调用时传入实例的文档列表 if lst is None: lst = self.lst.copy() # 递归终止条件:列表为空,返回0 if not lst: return 0 # 检查列表第一个元素 first_line = lst[0] match = 1 if word.lower() in first_line.lower() else 0 # 递归检查剩余列表 return match + self.count_words_r(word, lst[1:])
调用示例:doc.count_words_r("your_target_word")
额外优化:初始化方法的文件处理
原初始化代码可以用with语句自动管理文件资源,避免资源泄漏:
class Document: def __init__(self, filename): print("New Class") self.lst = [] with open(filename, "r") as text: for line in text.readlines(): stripped_line = line.strip() # 过滤空行和无效行 if stripped_line not in ['', '/']: self.lst.append(stripped_line) print(self.lst[0:10])
内容的提问来源于stack exchange,提问作者Berkay Poyraz
相关产品推荐
相关产品推荐

