Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中确定嵌套元组嵌套级别的简单方法_Python_Algorithm_Python 3.x_Recursion_Nested - Fatal编程技术网

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