2015-11-18 102 views
2

是否有一種簡單的方法來確定t(代表重組二叉樹)的嵌套級別(不依賴於Python的遞歸限制)?簡單的方法來確定嵌套元組的嵌套級別,在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 $

+1

請不要進行編輯,使答案無意義。編輯之前你正在討論遞歸深度,所以現在所有的答案都集中在這一點上。但是你真的遇到了遞歸深度問題嗎?看起來你只會爲't'的每一級遞歸一次,在你的例子中是4,然後是2。 – Teepeemm

+0

謝謝澄清。我意識到遞歸不應該是一個問題,所以任何確定深度的快速方法都應該起作用。它使問題更容易解釋(遞歸部分不必要地使問題複雜化)。 –

回答

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 

這將把字符串視爲另一個嵌套級別,這可能不是你想要的,但可能並不重要。

+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 

這不是一個遞歸函數,所以不會達到遞歸限制。