python: Recursion Algorithm

发布时间:2026/7/17 7:41:18

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/7/17 7:41:18

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

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

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

2026/7/17 7:41:18

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/7/17 7:41:18

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

[Bug已解决] Inductor 生成内核调用 empty_strided_cpu 负步长报错 Expected result 大于 0 解决方案

[Bug已解决] Inductor 生成内核调用 empty_strided_cpu 负步长报错 Expected result 大于 0 解决方案

2026/7/17 9:11:21

[Bug已解决] Inductor 生成内核调用 empty_strided_cpu 负步长报错 Expected result > 0 解决方案 一、现象长什么样 你用 torch.compile 编译了一个模型&#xff0c;运行时却崩在 Inductor&#xff08;PyTorch 的后端代码生成器&#xff09;生成的一段内核里&#xff0c;报…

人形机器人视觉系统:从感知到具身认知的技术闭环

人形机器人视觉系统:从感知到具身认知的技术闭环

2026/7/17 9:11:21

1. 人形机器人不是“会走路的铁疙瘩”&#xff0c;而是需要视觉中枢的活体系统最近刷到不少短视频&#xff1a;一个金属骨架的人形机器人在展厅里稳步行走、挥手致意&#xff0c;甚至能接住抛来的球。评论区一片惊叹&#xff0c;“中国智造太强了”“科幻照进现实”。但我在实验…

具身智能落地实战:制造业、物流与电力的工业级方案设计

具身智能落地实战:制造业、物流与电力的工业级方案设计

2026/7/17 9:11:21

1. 什么是具身智能&#xff1f;它不是“会动的AI”&#xff0c;而是能真正理解物理世界的行动主体“具身智能 行业应用方案解决方案”这个标题里&#xff0c;最常被误解的其实是“具身”两个字。很多人第一反应是“哦&#xff0c;就是给AI装个机器人身体”&#xff0c;然后联想…

基于pywinauto的微信桌面端自动化工具开发实战

基于pywinauto的微信桌面端自动化工具开发实战

2026/7/17 9:11:21

1. 项目概述&#xff1a;为什么我们需要一个微信桌面端自动化工具&#xff1f;在数字化办公和社群运营成为常态的今天&#xff0c;微信早已超越了即时通讯的范畴&#xff0c;成为了一个集客户服务、社群管理、内容分发、支付交易于一体的超级平台。无论是运营人员需要定时向多个…

Superpowers与OpenSpec:AI编程新范式解析

Superpowers与OpenSpec:AI编程新范式解析

2026/7/17 9:11:21

1. 项目概述&#xff1a;AI编程新范式下的Superpowers与OpenSpec组合在AI驱动的软件开发浪潮中&#xff0c;Superpowers与OpenSpec的组合正在成为技术团队的新标配。这套工具链的核心价值在于将规范驱动开发&#xff08;Spec-Driven Development&#xff09;与测试驱动开发&…

CMUdict与其他发音词典对比:为什么它是NLP工程师的首选?

CMUdict与其他发音词典对比:为什么它是NLP工程师的首选?

2026/7/17 9:01:21

CMUdict与其他发音词典对比&#xff1a;为什么它是NLP工程师的首选&#xff1f; 【免费下载链接】cmudict CMU US English Dictionary 项目地址: https://gitcode.com/gh_mirrors/cm/cmudict 在自然语言处理&#xff08;NLP&#xff09;和语音技术领域&#xff0c;发音词…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/16 0:35:09

Unity游戏文本翻译架构深度解析&#xff1a;XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/16 14:29:31

openEuler Raspberry Pi Kernel设备驱动开发指南&#xff1a;为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/16 14:18:17

openEuler系统集成测试实战&#xff1a;基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载&#xff1a;…

Cursor终端插件生态避坑指南:23个实测低效插件黑名单,附3个自研轻量替代方案

Cursor终端插件生态避坑指南:23个实测低效插件黑名单,附3个自研轻量替代方案

2026/7/17 0:00:57

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Cursor终端插件生态避坑指南概览 Cursor 作为基于 VS Code 内核构建的 AI 原生编辑器&#xff0c;其终端插件生态虽活跃&#xff0c;但存在兼容性断层、权限策略突变与调试链路断裂等典型风险。开发者常…

ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表)

ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表)

2026/7/17 0:00:57

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;ChatGPT写作提示词效率革命&#xff1a;单条提示词响应质量提升3.8倍的关键变量&#xff08;附可复用提示词矩阵表&#xff09; 提示词工程已从经验试错迈入变量驱动的科学阶段。实证研究表明&#xff0c;影响…

DeepSeek V4替换Codex底座模型的实践与优化

DeepSeek V4替换Codex底座模型的实践与优化

2026/7/17 0:00:57

1. 为什么选择用DeepSeek V4替换Codex的底座模型去年我在开发一个智能代码补全工具时&#xff0c;发现Codex的默认底座模型在复杂业务逻辑场景下表现不尽如人意。经过多次测试对比&#xff0c;DeepSeek V4在以下几个关键指标上展现出明显优势&#xff1a;代码补全准确率&#x…