鱼C论坛

 找回密码
 立即注册
查看: 3737|回复: 10

[已解决]30课2题,这里递归调用函数后为何要返回上一层目录没理解,求解答?

[复制链接]
发表于 2016-9-30 10:39:08 | 显示全部楼层 |阅读模式

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

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

x
30课2题,这里递归调用函数后为何要返回上一层目录没理解,求解答?

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)
最佳答案
2017-11-29 22:23:51
我也是初学者,看完答案才写出代码,我当时是这么理解的:因为在开始目录下的文件夹中可能还是找不到目标文件,此时‘search_file(each_file, target) # 递归调用’这个语句结束,就要进入‘ os.chdir(os.pardir)返回上一层目录’这个语句,在开始目录下继续搜索。举个例子,假设你的开始目录为文件夹A,里面有且仅有一个文件夹B和目标文件1.txt,B内无任何文件或文件夹。此时程序从B文件夹查找,并且通过递归函数查询B文件夹内部。由于B文件夹内没有任何文件(自然也没有目标文件),所以没有任何输出结果,此时程序自然走到'os.chdir(os.pardir) # 递归调用后切记返回上一层目录',当前工作目录从B文件夹返回到上一级A文件夹,此时再进行查询,才能找到1.txt,程序结束
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-29 22:23:51 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +8 鱼币

我也是初学者,看完答案才写出代码,我当时是这么理解的:因为在开始目录下的文件夹中可能还是找不到目标文件,此时‘search_file(each_file, target) # 递归调用’这个语句结束,就要进入‘ os.chdir(os.pardir)返回上一层目录’这个语句,在开始目录下继续搜索。举个例子,假设你的开始目录为文件夹A,里面有且仅有一个文件夹B和目标文件1.txt,B内无任何文件或文件夹。此时程序从B文件夹查找,并且通过递归函数查询B文件夹内部。由于B文件夹内没有任何文件(自然也没有目标文件),所以没有任何输出结果,此时程序自然走到'os.chdir(os.pardir) # 递归调用后切记返回上一层目录',当前工作目录从B文件夹返回到上一级A文件夹,此时再进行查询,才能找到1.txt,程序结束
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2018-6-23 12:45:47 | 显示全部楼层
jle55555 发表于 2017-11-29 22:23
我也是初学者,看完答案才写出代码,我当时是这么理解的:因为在开始目录下的文件夹中可能还是找不到目标文 ...

如果有A\\B\\C呢多递归几次呢 你这说的跟没说一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2018-12-2 19:50:44 | 显示全部楼层
刘超峰 发表于 2018-6-23 12:45
如果有A\\B\\C呢多递归几次呢 你这说的跟没说一样

他说的是对的,先搜索其他的文件夹,你要退出来才能进行进行下一个查询,至于A\\B\\C会在C搜索完之后,依次执行3次os.chdir(os.pardir)应该是这样,说的不对的地方还请见谅
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2018-12-2 19:51:18 | 显示全部楼层
jle55555 发表于 2017-11-29 22:23
我也是初学者,看完答案才写出代码,我当时是这么理解的:因为在开始目录下的文件夹中可能还是找不到目标文 ...

谢谢你,我懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-2 19:55:30 | 显示全部楼层
1、不返回上一级的话,就一个文件夹走到底了,不搜索别的同级的文件夹了。

2、不返回上一级的话,万一你这个文件夹走到底了,是个空文件夹呢?

综上所述,所以要返回上一级同级的文件夹,搜索别的文件夹看是否有目标文件。

没有的话,再上一级,一直搜索到指定目录。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-6-25 10:42:19 | 显示全部楼层
heidern0612 发表于 2018-12-2 19:55
1、不返回上一级的话,就一个文件夹走到底了,不搜索别的同级的文件夹了。

2、不返回上一级的话,万一你 ...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-1 00:38:36 From FishC Mobile | 显示全部楼层
思考了很久还是想不通啊,按照老师所说: 递归是必须要设置正确的返回条件才行,然而这个答案中os.chdir(os.pardir)成功执行的前提是os.path.isdir(each_file) 成立才行!!!

那么问题来了,如果A\B\C下只是一个和target 不相干的文件该怎么办呢?求解答!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-20 23:10:47 | 显示全部楼层
轻佻的弧度 发表于 2019-9-1 00:38
思考了很久还是想不通啊,按照老师所说: 递归是必须要设置正确的返回条件才行,然而这个答案中os.chdir(os. ...

如果不是target这个文件的话就不理他啊,接着执行for指令啊,for指令结束了程序就结束了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-22 12:32:45 | 显示全部楼层
本帖最后由 c996237895 于 2020-2-22 12:35 编辑
小新来学python 发表于 2019-9-20 23:10
如果不是target这个文件的话就不理他啊,接着执行for指令啊,for指令结束了程序就结束了!


因为你在递归里面会改变一次os的工作目录,下次for循环就会在那个工作目录里面,你把它换os.chdir(start_dir)也是可以的,但是有三层第二层的for就在第一层的目录里面了,所以是返回上一层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 16:22:28 | 显示全部楼层
感觉一知半解的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 15:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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