关于算法:在Python中确定嵌套元组嵌套级别的简便方法

Easy way to determine a nesting level of nested tuples, in Python

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

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

注意,如果不预先知道EDOCX1的深度(0),一个例程可能会面临递归限制,由sys.setrecursionlimit(n)设置,由sys.getrecursionlimit()查看。不过,在手之前将递归限制设置得很高,可能还不够,从而产生错误。

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

下面生成一个更大(更深)的t

1
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$


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
3
4
5
6
7
8
9
10
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

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