通过递归查找应用依赖

Python递归网上的例子很多大多是数学计算,我在工作遇到一个问题也需要递归来解决但是稍有不同,我们生产环境使用Dubbo分布式服务,Dubbo monitor可以显示应用的调用关系,但是现实情况是随着时间推移应用增多功能增多就会发生循环调用的情况,比如应用A的生产者是由应用A的消费者调用,这就是自己调用自己,还有的是隔了几级由调用回来了。看下图

现在的要求就是给定一个应用找出它直接和间接依赖的所有应用,相同的保留一个(这个相同指的是,A依赖B,B依赖E,E也依赖E,如果指定A,则返回B和E)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

dic1 = {
        ‘A‘: [‘B‘, ‘C‘, ‘D‘, ‘F‘],
        ‘B‘: [‘E‘],
        ‘C‘: [],
        ‘D‘: [‘F‘],
        ‘E‘: [‘E‘],
        ‘F‘: [‘B‘, ‘D‘]
    }

# 保存结果的列表
list1 = []

def findApp(name):
    # 这里判断如果该应用谁也不依赖就直接返回None,不依赖别人说明自己是一个基础服务,属于被调用方。
    if len(dic1[name]) == 0:
        return None
    else:
        # 遍历给定应用的直接依赖应用
        for i in dic1[name]:
            # 这里判断是否已经添加到结果列表里,作用是不重复添加,其实这里最大的作用就是为了避免循环调用产生的无穷无尽
            if i in list1:
                continue
            # 如果结果列表中没有就添加进来
            list1.append(i)
            # 调用自己把i传递进去找i这个应用的下一级,如此反复
            findApp(i)

def main():
    # A 应用期望的输出为 B C D F E
    try:
        findApp(‘A‘)
    except Exception as err:
        print err.message
    print set(list1)

if __name__ == "__main__":
    try:
        main()
    finally:
        sys.exit()

其实大家可以自己看一下A里面存在2处循环调用,如果你不控制,那么递归到最深一层就会报错,而结果也不是我们想要的。所以必须控制循环调用的这种情况。

原文地址:https://www.cnblogs.com/yunxizhujing/p/9498485.html

时间: 2024-08-30 13:29:00

通过递归查找应用依赖的相关文章

[javaSE] IO流(递归查找指定文件)

递归方法,实现查找目录中以.java为后缀的文件路径,并存入文本文件中 定义一个静态方法fileToLine(),传入参数:File对象目录,List集合对象(List<File> 这样做的目的是因为这个方法会被递归,因此不能在内部创建,并且List集合是引用传递) 调用File对象的listFiles()方法,获取目录数组File[] files 循环这个数组for(File file : files),循环中 判断是否是目录file.isDirectory为真,进行递归fileToLine

php递归查找指定目录下及子文件名称是否包含中文空格及括号

1 //php递归查找该目录下及子文件名称是否包含中文空格括号 2 function searchDir($path,&$data){ 3 if(is_dir($path)){ 4 $dp=dir($path); 5 while($file=$dp->read()){ 6 if($file!='.'&& $file!='..'){ 7 searchDir($path.'/'.$file,$data); 8 } 9 } 10 $dp->close(); 11 } 12 i

无限极分类中递归查找一个树结构

问题:设计公司的员工表,员工有不同级别,要求可通过一个员工查到其下属的所有员工,也可查到其所属的上级. 解决:递归实现无限分类思想,每一个员工存入其所属的上级的id作为自己的pid,另外存入path,path包含自身id,方便显示路径. 递归的注意点: 1.一定有一个判断条件,否则递归就死循环了 2.每次的递归结果要保存起来,变量自增的实现三种方式: function(&$bar):通过引用地址 global :通过设置为全局变量 static :设置为静态变量 header( "Con

lua 使用递归查找键值

function cc.exports.findValueByTbl(tbl,key)--递归方法,用于查找tbl中对应的键值 for k,v in pairs(tbl) do if k == key then if type(tbl[i])=="table" then--如果是table类型,递归查找 return findValueByTbl(v,key) else return v end end end end

自动查找so依赖

一.脚本编写 适配系统的时候,需要查找一些依赖文件,手工用winhex或UltraEdit来找挺麻烦的. 所以写了个shell脚本,用来批量取得这些依赖关系. 在linux系统下,把如下内容存为getNEED.sh [plain] view plain copy print? #/bin/bash #by changyuet printf "**************************************\n" printf "please put this sh

[WinForm]按名称递归查找控件

关键代码: /// <summary> /// 向下递归查找控件 /// </summary> /// <param name="parentControl">查找控件的父容器控件</param> /// <param name="findCtrlName">查找控件名称</param> /// <returns>若没有查找到返回NULL</returns> public

WinForm实现按名称递归查找控件的方法

本文所述实例主要实现了WinForm实现按名称递归查找控件的功能,在C#项目开发中有一定的应用价值,分享给大家供大家参考借鉴. 关键代码如下: /// <summary> /// 向下递归查找控件 /// </summary> /// <param name="parentControl">查找控件的父容器控件</param> /// <param name="findCtrlName">查找控件名称<

Android Studio 查找aar依赖的顺序

Android Studio 查找aar依赖的顺序: Searched in the following locations: file:/E:/android_studio/sdk/extras/m2repository//netframe-debug//netframe-debug-.pom file:/E:/android_studio/sdk/extras/m2repository//netframe-debug//netframe-debug-.aar file:/E:/android

目录下文件递归查找

python 使用yield实现目录下文件的递归查找(windows & linux通用) 转载自:https://www.cnblogs.com/weiok/p/4872119.html import os import fnmatch def iterfindfiles(path, fnexp): for root, dirs, files in os.walk(path): for filename in fnmatch.filter(files, fnexp): yield os.pat