python: Recursion Algorithm

发布时间:2026/10/1 4:09:57

python: Recursion Algorithm
# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Recursion Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/7/16 22:04 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : Recursion.py from typing import List, Dict, Set, Optional # 常量定义珠宝行业细分权限 PERMISSION_LIST { # 通用门店权限 sale_view: 销售单据查看, sale_create: 开单销售, stock_view: 库存查询, stock_inout: 金银玉石出入库, member_manage: 会员档案管理, # 分公司/总部财务权限 finance_stat: 财务报表统计, cost_allocate: 分公司成本分摊, gold_price_adjust: 金价基准调整, # 海外子公司专属权限 customs_declare: 海外报关申报, foreign_exchange: 外币结算对账, overseas_tax: 境外税务核算, # 集团总部顶层权限 org_edit: 新增/删除分公司/海外子公司, role_global: 全局角色配置, all_data_export: 全集团数据导出 } # 组织树实体递归树形结构 class OrgNode: def __init__( self, org_id: str, org_name: str, org_type: str, # 总部/国内事业部/分公司/海外子公司/分店 parent_id: Optional[str] None ): self.org_id org_id self.org_name org_name self.org_type org_type self.parent_id parent_id self.children: List[OrgNode] [] # 子组织递归核心 self.org_permissions: Set[str] set() # 本组织独立权限 def add_child(self, child_node: OrgNode) - None: self.children.append(child_node) def add_permission(self, perm_key: str) - None: if perm_key in PERMISSION_LIST: self.org_permissions.add(perm_key) def get_all_self_perm_desc(self) - List[str]: return [PERMISSION_LIST[p] for p in self.org_permissions] # 用户角色实体 class StaffUser: def __init__(self, user_id: str, username: str, bind_org_id: str): self.user_id user_id self.username username self.bind_org_id bind_org_id # 用户归属组织ID self.role_perms: Set[str] set() # 用户角色分配权限 def assign_role_perm(self, perm_key: str): if perm_key in PERMISSION_LIST: self.role_perms.add(perm_key) # 递归核心算法工具类 class JewelryOrgRecursionUtil: staticmethod def find_org_by_id(root: OrgNode, target_org_id: str) - Optional[OrgNode]: 递归查找指定ID的组织节点 if root.org_id target_org_id: return root # 递归遍历所有子节点 for child in root.children: res JewelryOrgRecursionUtil.find_org_by_id(child, target_org_id) if res: return res return None staticmethod def get_all_sub_orgs(root: OrgNode, target_org_id: str) - List[OrgNode]: 递归获取目标组织下所有下属分公司、分店含自身 target_node JewelryOrgRecursionUtil.find_org_by_id(root, target_org_id) if not target_node: return [] result [] def dfs(node: OrgNode): result.append(node) for child in node.children: dfs(child) dfs(target_node) return result staticmethod def get_ancestor_orgs(root: OrgNode, target_org_id: str, parent_map: Dict[str, OrgNode]) - List[OrgNode]: 递归向上查找所有上级组织总部、事业部、分公司 target_node JewelryOrgRecursionUtil.find_org_by_id(root, target_org_id) if not target_node or target_node.parent_id is None: return [] ancestors [] def upward_recursion(node: OrgNode): pid node.parent_id if pid is None: return p_node parent_map.get(pid) if p_node: ancestors.append(p_node) upward_recursion(p_node) upward_recursion(target_node) return ancestors staticmethod def recursive_collect_all_permissions(root: OrgNode, target_org_id: str, user: StaffUser) - Set[str]: 递归合并权限 1. 用户自身角色权限 2. 归属组织自身权限 3. 所有下属组织权限上级可查看下级数据 all_perms set(user.role_perms) sub_orgs JewelryOrgRecursionUtil.get_all_sub_orgs(root, target_org_id) # 递归汇总下属所有组织权限 for org in sub_orgs: all_perms.update(org.org_permissions) return all_perms staticmethod def recursive_print_tree(node: OrgNode, level: int 0): 递归打印珠宝集团完整组织树可视化 indent * level print(f{indent}[{node.org_type}] {node.org_name} | ID:{node.org_id}) for child in node.children: JewelryOrgRecursionUtil.recursive_print_tree(child, level 1) staticmethod def recursive_revoke_perm(node: OrgNode, perm_key: str): 递归回收某条权限当前节点所有下级子组织全部移除 if perm_key in node.org_permissions: node.org_permissions.remove(perm_key) for child in node.children: JewelryOrgRecursionUtil.recursive_revoke_perm(child, perm_key) # 初始化珠宝集团树形数据 def init_jewelry_group_tree() - tuple[OrgNode, Dict[str, OrgNode]]: # 1. 创建根节点珠宝集团总部 root OrgNode( org_idG001, org_name星光珠宝集团总部, org_type集团总部 ) # 总部顶层权限 root.add_permission(org_edit) root.add_permission(role_global) root.add_permission(all_data_export) root.add_permission(gold_price_adjust) # 2. 国内事业部 domestic_biz OrgNode(D001, 国内事业部, 事业部, parent_idG001) domestic_biz.add_permission(finance_stat) domestic_biz.add_permission(cost_allocate) root.add_child(domestic_biz) # 华南分公司 huanan_branch OrgNode(D001-1, 华南分公司, 国内分公司, parent_idD001) huanan_branch.add_permission(stock_inout) huanan_branch.add_permission(member_manage) domestic_biz.add_child(huanan_branch) # 华南下属分店 sz_shop OrgNode(SH-SZ01, 深圳旗舰店, 线下分店, parent_idD001-1) sz_shop.add_permission(sale_view) sz_shop.add_permission(sale_create) huanan_branch.add_child(sz_shop) gz_shop OrgNode(SH-GZ01, 广州分店, 线下分店, parent_idD001-1) gz_shop.add_permission(sale_view) gz_shop.add_permission(stock_view) huanan_branch.add_child(gz_shop) # 华东分公司 huadong_branch OrgNode(D001-2, 华东分公司, 国内分公司, parent_idD001) sh_shop OrgNode(SH-SH01, 上海总店, 线下分店, parent_idD001-2) sh_shop.add_permission(sale_create) huadong_branch.add_child(sh_shop) domestic_biz.add_child(huadong_branch) # 3. 海外事业部 oversea_biz OrgNode(O001, 海外事业部, 事业部, parent_idG001) oversea_biz.add_permission(foreign_exchange) root.add_child(oversea_biz) # 新加坡海外子公司 sg_company OrgNode(O001-1, 新加坡星光珠宝子公司, 海外子公司, parent_idO001) sg_company.add_permission(customs_declare) sg_shop OrgNode(SH-SG01, 新加坡乌节路分店, 海外分店, parent_idO001-1) sg_shop.add_permission(sale_view) sg_company.add_child(sg_shop) oversea_biz.add_child(sg_company) # 美国海外子公司 us_company OrgNode(O001-2, 洛杉矶珠宝子公司, 海外子公司, parent_idO001) us_company.add_permission(overseas_tax) us_shop OrgNode(SH-US01, 洛杉矶门店, 海外分店, parent_idO001-2) us_shop.add_permission(sale_view) us_company.add_child(us_shop) oversea_biz.add_child(us_company) # 构建组织ID映射表快速查询父节点 node_map {} def collect_node(node: OrgNode): node_map[node.org_id] node for child in node.children: collect_node(child) collect_node(root) return root, node_map # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Recursion Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/7/16 22:05 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : RecursionBll.py import Recursion.Recursion from Recursion.Recursion import * class RecursionBll(object): def demo(self): :return: pass # 1. 初始化集团组织树 group_root, org_map init_jewelry_group_tree() util JewelryOrgRecursionUtil() print( 1. 递归打印完整珠宝集团组织架构 ) util.recursive_print_tree(group_root) # 2. 创建测试用户深圳旗舰店店长归属深圳分店SH-SZ01 shop_manager StaffUser( user_idU1001, username深圳门店店长-李金饰, bind_org_idSH-SZ01 ) # 分配门店角色权限 shop_manager.assign_role_perm(sale_view) shop_manager.assign_role_perm(stock_view) print(\n 2. 递归查询深圳店长完整可用权限含下属本店无下级 ) total_perms util.recursive_collect_all_permissions(group_root, SH-SZ01, shop_manager) for p in sorted(total_perms): print(f- {PERMISSION_LIST[p]}) # 3. 创建华南分公司管理员 south_admin StaffUser(U2001, 华南分公司运营总监, bind_org_idD001-1) south_admin.assign_role_perm(finance_stat) print(\n 3. 华南分公司管理员递归汇总所有下属组织权限 ) south_all_perm util.recursive_collect_all_permissions(group_root, D001-1, south_admin) for p in sorted(south_all_perm): print(f- {PERMISSION_LIST[p]}) # 4. 递归回收权限全华南区域下架开单权限sale_create util.recursive_revoke_perm(util.find_org_by_id(group_root, D001-1), sale_create) print(\n 4. 递归回收sale_create权限后华南区域权限重新查询 ) south_new_perm util.recursive_collect_all_permissions(group_root, D001-1, south_admin) for p in sorted(south_new_perm): print(f- {PERMISSION_LIST[p]}) # 5. 递归获取新加坡海外子公司所有下属门店 print(\n 5. 递归遍历新加坡海外子公司全部下属组织 ) sg_sub_orgs util.get_all_sub_orgs(group_root, O001-1) for org in sg_sub_orgs: print(f- {org.org_type}{org.org_name}) # 6. 递归向上查询新加坡分店所有上级组织 print(\n 6. 递归向上查询新加坡分店上级链路 ) sg_shop_ancestors util.get_ancestor_orgs(group_root, SH-SG01, org_map) for org in sg_shop_ancestors: print(f- 上级[{org.org_type}]{org.org_name})输出

相关新闻

SVG动画实战:path与animateMotion的完美结合

SVG动画实战:path与animateMotion的完美结合

2026/8/23 0:05:53

1. SVG动画基础&#xff1a;path与animateMotion的黄金组合在网页动画领域&#xff0c;SVG&#xff08;可缩放矢量图形&#xff09;一直保持着独特的优势。不同于基于像素的位图动画&#xff0c;SVG动画具有无限缩放不失真、文件体积小、可通过CSS/JS控制等特性。而<path>…

Stable Diffusion标签编辑器的代码架构解析:插件开发者的技术指南

Stable Diffusion标签编辑器的代码架构解析:插件开发者的技术指南

2026/9/30 13:43:45

Stable Diffusion标签编辑器的代码架构解析&#xff1a;插件开发者的技术指南 【免费下载链接】stable-diffusion-webui-dataset-tag-editor Extension to edit dataset captions for SD web UI by AUTOMATIC1111 项目地址: https://gitcode.com/gh_mirrors/st/stable-diffus…

微信聊天记录本地解密与结构化导出:WxMsgDump原理与实践指南

微信聊天记录本地解密与结构化导出:WxMsgDump原理与实践指南

2026/9/28 16:27:04

1. 项目概述&#xff1a;为什么我们需要一个高效的聊天记录导出方案&#xff1f; 在数字生活高度渗透的今天&#xff0c;微信早已超越了即时通讯工具的范畴&#xff0c;成为了我们工作、生活和社交的“数字档案库”。无论是重要的商务沟通、珍贵的家庭回忆&#xff0c;还是项目…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/29 22:00:59

aclmdlAddDatasetBuffer 【免费下载链接】ge GE&#xff08;Graph Engine&#xff09;是面向昇腾的图编译器和执行器&#xff0c;提供了计算图优化、多流并行、内存复用和模型下沉等技术手段&#xff0c;加速模型执行效率&#xff0c;减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/30 20:35:35

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/30 20:35:38

Transformers 音频特征提取工具库 audio_utils 全解析&#xff1a;从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers &#x1f917; Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/30 20:35:36

RustFS 多节点集群重启与滚动升级实战&#xff1a;Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs &#x1f680;2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/30 20:35:33

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/30 8:20:32

RustFS Scanner 数据用量发布权威性决策&#xff1a;配额准入如何获得可用的权威依据 【免费下载链接】rustfs &#x1f680;2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…