如何将文件大小求和函数转为递归函数?求转换方法
修改后的递归版本代码
import os def recls_rtsize(argpath): sumsize = 0 for entry in os.scandir(argpath): # 用os.path.join拼接路径,避免手动加斜杠的兼容性问题 path = os.path.join(argpath, entry.name) if entry.is_dir(): # 如果是目录,递归调用自身计算子目录的总大小 sumsize += recls_rtsize(path) else: # 如果是文件,直接累加文件大小 sumsize += os.path.getsize(path) return sumsize print("total:", recls_rtsize('/var/log'))
非递归转递归的通用思路
- 识别递归结构:找到问题中可重复的子问题。比如计算目录总大小的场景,每个子目录的总大小计算逻辑和根目录完全一致,这就是天然的递归子问题。
- 明确基线条件:确定递归的终止节点。这里的基线是当处理的条目是文件时,直接返回文件大小(无需再递归);如果是空目录,循环不会执行,直接返回0,这也是一种隐性的终止条件。
- 重构逻辑为递归调用:把原循环中处理子问题的代码,替换成对自身函数的调用。原代码缺失目录处理逻辑,现在换成递归调用函数来获取子目录的总大小,补全了原本的逻辑漏洞。
- 替换迭代累加为递归累加:原函数靠循环逐个累加文件大小,现在对于每个目录条目,要么直接加文件大小,要么加递归调用返回的子目录总大小,本质是把迭代的线性累加转化为递归的分层累加。
内容的提问来源于stack exchange,提问作者user20156403
相关产品推荐
相关产品推荐

