You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 2元组树结构深度计算递归函数实现求助

解决Python 2中递归计算元组树深度的问题

你的思路方向是对的——给叶子节点记0,非叶子节点取子节点深度最大值加1,但原函数的逻辑有几个小问题导致无法正确运行,我帮你修正并解释清楚。

先看原函数的问题点

  1. 未处理叶子节点边界:当输入是单个叶子(比如'x'),原函数会尝试执行len(expr),但字符串的len返回的是字符长度,这完全不是我们要的,而且会进入错误的循环流程。
  2. 判断逻辑搞反:原函数里isinstance(expr,(list,tuple)) == 0判断的是当前外层的expr,但我们需要判断的是循环里的子元素是否为叶子节点。
  3. 循环内提前返回:if len(a) == len(expr): return max(a)会导致循环还没遍历完所有子节点就提前返回,结果肯定不对。

修正后的递归函数

def depth(expr):
    # 叶子节点:不是列表或元组,深度为0
    if not isinstance(expr, (list, tuple)):
        return 0
    # 非叶子节点,遍历所有子节点计算深度
    max_child_depth = 0
    for item in expr:
        child_depth = depth(item)
        if child_depth > max_child_depth:
            max_child_depth = child_depth
    # 当前节点深度 = 子节点最大深度 + 1(自身这一层)
    return 1 + max_child_depth

测试你的输入示例

ls0 = 'x'
ls1 = ('expt', 'x', 2)
ls2 = ('+', ('expt', 'x', 2), ('expt', 'y', 2))
ls4 = ('/', ('expt', 'x', 5), ('expt', ('-', ('expt', 'x', 2),1), ('/', 5, 2)))

print(depth(ls0))  # 输出 0(符合叶子节点的定义)
print(depth(ls1))  # 输出 1
print(depth(ls2))  # 输出 2
print(depth(ls4))  # 输出 4

逻辑解释

完全贴合你的思路:

  • 遇到叶子节点(非列表/元组类型)直接返回0;
  • 遇到非叶子节点,递归遍历每一个子节点,找到子节点的最大深度;
  • 当前节点的深度就是子节点最大深度加1(因为自身也是一层),递归向上传递这个值,最终得到整棵树的深度。

内容的提问来源于stack exchange,提问作者Operationbackfire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:50:55