在Python中,简单的方法来确定嵌套元组的嵌套级别

时间:2015-11-18 19:16:05

标签: python algorithm python-3.x recursion nested

是否有一种简单的方法来确定t(代表重组二叉树)的嵌套级别(不依赖于Python的递归限制)?

t = (4, (3, 5, (2, 4, 6, (1, 3, 5, 7))))

请注意,如果没有t深度的先验知识,例程可能会面临递归限制,该限制由sys.setrecursionlimit(n)设置并由sys.getrecursionlimit()查看。尽管如此,手动设置递归限制非常高,可能还不够,从而产生错误

`RecursionError: maximum recursion depth exceeded while calling a Python object`. 

以下内容会生成更大(更深)的t

t = tuple(tuple(range(k)) for k in range(1,200))`

我想这些可能有用(还没有详细说明):

  • 可以将t转换为字符串并计算左括号的数量
  • 如果扁平元组的大小为$ N $,则深度具有$ n(n + 1)/ 2 = N $的正二次根的大小,即$ n =( - 1+ \ sqrt(1+) 8N))/ 2 $
  • 迭代地剥离(并计数)外部容器,直到最深的嵌套
  • 其他人吗?

P.S。任何想法为什么内联TeX不会在我的问题中呈现?测试:$ N $

2 个答案:

答案 0 :(得分:3)

您可以将递归函数转换为您自己管理的堆栈,例如

t = (4, (3, 5, (2, 4, 6, (1, 3, 5, 7))))

def depth(t):
    max_depth = 0
    A = [(t,max_depth)]
    while A:
        x,depth = A.pop()
        if isinstance(x, (list, tuple)):
            for a in x:
                A.append((a,depth+1))
        else:
            max_depth = max(max_depth,depth)
    return max_depth

print depth(1)  # Prints 0
print depth((1,1)) # Prints 1
print depth(t) # Prints 4

这不是递归函数,因此不会达到递归限制。

答案 1 :(得分:2)

你的原始问题谈到递归限制是一个问题,但你的例子并没有接近那个。我建议您采用最Pythonic方法,并且如果它们开始出现问题,只会担心递归限制。这个问题的递归方法是找到每个元素的深度,并取最大值。

def depth(t):
    try:
        return 1+max(map(depth,t))
    except:
        return 0

t = (4, (3, 5, (2, 4, 6, (1, 3, 5, 7))))
print(depth(t)) # 4
t = tuple(tuple(range(k)) for k in range(1,200))
print(depth(t)) # 2

这会将字符串视为另一个嵌套级别,这可能不是您想要的,但可能无关紧要。