账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    递归深度优先查找的返回值的问题
    35
    0

    写了个函数实现递归的查找文件或者文件夹,但是返回值一值为None,代码如下:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import os
    import argparse
    from collections import deque
    
    
    def findFile1(path, file):
        '''To implent the simple functions like linux command -- find.'''
        # Depth First Search
        with os.scandir(path) as entryDir:
            for entry in entryDir:
                if entry.is_file(follow_symlinks=True) and entry.name == file:
                    print(entry.path)
                    return entry.path  # print能正常输出结果,但是return却是None,为什么?
                if entry.is_dir(follow_symlinks=True):
                    if entry.name == file:
                        print(entry.path)
                        return entry.path
                    else:
                        findFile1(path=entry.path, file=file)
                        # return findFile1(path=entry.path, file=file) 这里用return的时候print的输出都没了,这是为什么
    
    if __name__ == '__main__':
        parser = argparse.ArgumentParser('To implent the simple functions like linux command -- find.')
        parser.add_argument('-p', '--path', type=str, help='the root directory to find file.')
        parser.add_argument('-f', '--file', type=str, help='the file or dir to find.')
        args = vars(parser.parse_args())
        path = args['path']
        file = args['file']
    
        res = findFile1(path, file)
        print(res)

    运行函数:

    $ python D:\scripts\funny\find_file.py -p D:\sublime_coding -f notes.py
    D:\sublime_coding\matplotlib\notes.py
    None
    
    #当递归那一步使用 return findFile1(path=entry.path, file=file) 时,返回结果直接为None了,print输出都没了
    $ python D:\scripts\funny\find_file.py -p D:\sublime_coding -f notes.py
    None

    请教问题出在哪里,谢谢!

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 月牙笑眼 普通会员 1楼

      递归深度优先查找(DFS)是一种在图中搜索一个节点的方法,它的基本思想是从起始节点开始,沿着路径向前遍历,同时记录每一步的路径。DFS通常用于解决许多问题,例如遍历图中的所有节点,寻找从一个节点到另一个节点的最短路径,或者寻找图中的所有连通分量。

      在递归深度优先查找中,可能会出现返回值的问题。当递归到达叶子节点时,没有子节点需要进一步搜索,这时递归将停止。但是,如果我们没有处理这种情况,那么递归深度优先查找可能会无限制地进行下去,导致程序崩溃。

      例如,假设我们有一个有向图,其中每个节点都有一对邻接节点。如果我们使用递归深度优先查找来寻找一个节点的邻居,那么每次我们都会访问到这个节点的每个邻居,这可能会导致大量的内存使用和CPU使用。

      为了避免这个问题,我们可以使用一种称为“深度优先搜索”的方法,它可以避免无限制地访问邻接节点。深度优先搜索首先访问一个节点,然后沿着这个节点的邻居进行递归搜索。当递归到达叶子节点时,函数将返回一个包含所有邻居的列表,而不是遍历所有的邻接节点。

      此外,我们还可以使用一个变量来记录当前的深度,以避免重复访问已经访问过的节点。在递归搜索中,我们每次递归访问一个节点时,都将当前的深度加1。当递归到达叶子节点时,我们将当前的深度加1,并继续递归搜索下一个节点。这样,我们就可以确保只访问已经访问过的节点,而不会重复访问它们。

      总的来说,递归深度优先查找可能会返回大量的结果,但如果正确处理,我们就可以避免这个问题,保证结果的唯一性。

    更多回答
    网站公告
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部