鱼C论坛

 找回密码
 立即注册
查看: 1027|回复: 6

课后习题30讲的第2题

[复制链接]
发表于 2018-6-23 11:39:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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)
########为啥调用递归时后的os.chdir(os.pardir)放在跟递归同缩进的地方 当递归到最底层时就没目录了啊 也就不会执行if os.path.isdir(each_file) 这个语句了啊  那我要接着返回执行for 语句啊 那后面的os.chdir(os.pardir)就执行不到啊 也就不能返回到上一级目录啊  #这要咋理解啊大神们 求详解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-6-23 11:59:35 | 显示全部楼层
最加提问 如果说返回到上一级目录后,然后for循环迭代这个目录里的文件时又把之前的目录再执行一次递归这不是无限循环吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-23 12:59:10 | 显示全部楼层
递归的要点是
当进入递归,后面的代码暂时挂起,等到返回的时候再接着执行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-6-23 14:41:14 | 显示全部楼层
比如:A目录下有子目录B 和 C。进入A目录后,发现B目录,触发递归,执行完毕后,通过os.chdir(os.pardir)返回A目录 ,然后发现C目录,触发递归,执行完毕后,通过os.chdir(os.pardir)返回A目录 。如果B目录、C目录下也有子目录,也是通过os.chdir(os.pardir)返回上一级目录
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-23 16:53:45 | 显示全部楼层
thexiosi 发表于 2018-6-23 14:41
比如:A目录下有子目录B 和 C。进入A目录后,发现B目录,触发递归,执行完毕后,通过os.chdir(os.pardir) ...

?难道不是发现B目录以后再进入C吗直到没有子目录时递归结束然后返回上一级目录吗 怎么还进到B以后 返回A 然后再进到C 怎么弄的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-23 17:06:47 | 显示全部楼层
thexiosi 发表于 2018-6-23 14:41
比如:A目录下有子目录B 和 C。进入A目录后,发现B目录,触发递归,执行完毕后,通过os.chdir(os.pardir) ...

比如说进入到A目录以后,发现B目录调用递归,工作目录切换成B目录,执行过程中又发现B目录中的子目录C又得调用递归吧  你说的发现B目录 递归后就执行os.chdir(os.pardir),根本就不会好么,当执行B目录后。它又发现C目录 递归还没结束 怎么跟你调用os.chdir(os.pardir)   你自己弄懂了吗??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-23 20:30:47 | 显示全部楼层
哦,不好意思,可能是我描述的不清楚,我的意思是 A目录下有B、C两个子目录, B、C下无子目录:..\A\B,  ..A\C

‘比如:A目录下有子目录B 和 C。进入A目录后,发现B目录,触发递归,执行完毕后,通过os.chdir(os.pardir)返回A目录 ,然后发现C目录,触发递归,执行完毕后,通过os.chdir(os.pardir)返回A目录 。’


如果B下有子目录b,那顺序为:进入A目录后,发现B目录,触发递归(此处叫递归1),接着发现目录b,再次触发递归(此处叫递归2),递归2结束后,通过os.chdir(os.pardir)返回目录B,递归1结束后,通过os.chdir(os.pardir)返回目录A
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 15:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表