妙用递归1:从别人代码里看到的有趣递归

目标:

# 假设我们有一个目录结构如下:
# /path/to/directory/
# ├── file1.txt
# ├── subdir1/
# │   ├── file2.txt
# │   └── file3.txt
# └── subdir2/
#     └── file4.txt

希望得到的结果是

/path/to/directory/file1.txt
/path/to/directory/subdir1/file2.txt
/path/to/directory/subdir1/file3.txt
/path/to/directory/subdir2/file4.txt

怎么办?

我们需要分门别类为os.listdir(/path/to/directory/)下面的内容做区别吗?如果文件结构只有两层还好办,层数很多怎么办?

我们在脑子里预先写代码的时候,就能意识到这里有嵌套结构,对于A:是文件;~A:是文件夹两种情况,对于后者我们又需要判断文件夹下的内容到底属于哪一种情况。于是又要考虑同样的判断,子子孙孙无穷尽也。

意识到这种嵌套,就有一个经验:可以用递归来完成这个任务。

在~A的情况下,先假设只有两级情况,两级的情况可以解决,就有可能解决后面的情况。因为一个能解决无穷级任务的代码,肯定能解决两级的情况。

对于~A的情况,对文件夹下的每个文件,调用这个fun(),那么肯定是可以按照第一种情况解决问题的。

现在这个代码能够解决两级的问题了。那么对于三级的嵌套,它也可以通过A和~A化解成子任务,也能解决。于是数学归纳法成立了,它可以解决无穷级的问题。

代码如下:

def walkfile(spath):
    """get files in input spath """
    files = os.listdir(spath)
    for file in files:
        tmppath = os.path.join(spath, file)   
        if not os.path.isdir(tmppath):
            yield tmppath
        else:
            for lowfile in walkfile(tmppath):  # 递归结构
                yield lowfile
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值