是否有一种简单的方法来确定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
转换为字符串并计算左括号的数量P.S。任何想法为什么内联TeX不会在我的问题中呈现?测试:$ N $
答案 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
这会将字符串视为另一个嵌套级别,这可能不是您想要的,但可能无关紧要。