Python中确定嵌套元组嵌套级别的简单方法
是否有一种简单的方法来确定Python中确定嵌套元组嵌套级别的简单方法,python,algorithm,python-3.x,recursion,nested,Python,Algorithm,Python 3.x,Recursion,Nested,是否有一种简单的方法来确定t(表示重组二叉树)的嵌套级别(不依赖Python的递归限制) 请注意,如果事先不知道t的深度,例程可能会面临递归限制,该限制由sys.setrecursionlimit(n)设置,并由sys.getrecursionlimit()查看。不过,事先将递归限制设置得很高可能是不够的,因此会产生错误 `RecursionError: maximum recursion depth exceeded while calling a Python object`. 以下内容
t
(表示重组二叉树)的嵌套级别(不依赖Python的递归限制)
请注意,如果事先不知道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$
- 反复剥离(并计数)外部容器,直到嵌套最深
- 还有其他的吗
顺便问一下,你知道为什么在我的问题中,内联TeX没有渲染吗?测试:$N$您可以将递归函数转换为自己管理的堆栈,例如
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
这不是一个递归函数,因此不会达到递归限制。您最初的问题谈到了递归限制是一个问题,但您的示例与此不符。我建议您采用最具python风格的方法,并且只在递归限制出现问题时才考虑它们。一种递归方法是找到每个元素的深度,并取最大值
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
这会将字符串视为另一个嵌套级别,这可能不是您想要的,但可能无关紧要。请不要进行使答案变得毫无意义的编辑。您在编辑之前讨论了递归深度,所以现在所有的答案都集中在这一点上。但是你真的遇到了递归深度的问题吗?对于
t
的每个级别,您似乎只会递归一次,在您的示例中是4,然后是2。感谢您的澄清。我意识到递归不应该是一个问题,所以任何快速确定深度的方法都应该有效。它使问题更容易解释(递归部分不必要地使问题复杂化)。谢谢你的注释。最初,递归限制引起了一个错误,但我后来意识到这与屏幕上的输出有关,而不是计算。所以,事实上,我会担心递归限制,因为它以后会成为一个问题。
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