胖豆lucky 发表于 2018-12-11 20:55:23

030 第2题 为什么递归调用后切记返回上一层目录

琢磨了很久也看了一些分析贴可是还是很迷糊~{:10_266:}

import os

def search_file(start_dir, target) :
    os.chdir(start_dir)
   
    for each_file in os.listdir(os.curdir) :
      if each_file == target :
            print(os.getcwd() + os.sep + each_file) # 使用os.sep是程序更标准
      if os.path.isdir(each_file) :
            search_file(each_file, target) # 递归调用
            os.chdir(os.pardir) # 递归调用后切记返回上一层目录

start_dir = input('请输入待查找的初始目录:')
target = input('请输入需要查找的目标文件:')
search_file(start_dir, target)

塔利班 发表于 2018-12-11 21:10:37

你进了个文件夹A,里面有B,C,D文件夹,于是你先进了B,B里你搜索完了是不是得出来看C

ba21 发表于 2018-12-11 21:10:57

不要执着在代码上。
想像用生活中的例子
比如你亲戚家拜年,总会有回的一天吧。
再比如你去几个地方旅游,玩完之后原路返回最后到家;(注意不是直接回家,这就跟递归一个道 理了)

一句话就是有去有回。

除非你不回了;那就不叫递归了。

heidern0612 发表于 2018-12-12 15:51:14

为啥返回上一级呢?

因为如果这一级找不到,你得返回上一级继续找,不能一个文件夹死到底。

如C:\BACKUP\Programe\Drive文件夹,一直钻到Drive文件夹里,但是没有目标文件怎么办?或者是个空文件夹怎么办?

这种情况就得返回上一级目录,在上一级目录中所有的同级目录中寻找,如果没有,再返回上一级。..

类推。

胖豆lucky 发表于 2018-12-12 16:15:05

heidern0612 发表于 2018-12-12 15:51
为啥返回上一级呢?

因为如果这一级找不到,你得返回上一级继续找,不能一个文件夹死到底。


比如A文件夹下有B文件夹(里面没有目标文件)和C文件夹(有目标文件)
B文件夹里没有找到,结束;但是有for each_file in os.listdir(os.curdir),后面不是也会查询C文件夹有没有目标文件吗?

heidern0612 发表于 2018-12-12 17:49:03

本帖最后由 heidern0612 于 2018-12-12 18:08 编辑

胖豆lucky 发表于 2018-12-12 16:15
比如A文件夹下有B文件夹(里面没有目标文件)和C文件夹(有目标文件)
B文件夹里没有找到,结束;但是有 ...


它实现的流程是:因为递归,一个文件夹先钻到底,没有的话往回返。因为for循环,没有目标文件的话,搜索上一级全部,再搜索上上一级全部...

看这个:戳我前进
页: [1]
查看完整版本: 030 第2题 为什么递归调用后切记返回上一层目录