簡體   English   中英

類型錯誤:解包元組遞歸 function 調用

[英]Type error: unpacking tuples Recursive function call

我有以下代碼:

def myCalculation(self, root, max_val): 
        
        if root == None:
            return -1
        
        LH = 1 + (self.myCalculation(root.left, max_val))[0]
        RH = 1 + (self.myCalculation(root.right, max_val))[0]
        
        ret = LH+RH
        
        if max_val < ret:
            max_val = ret
            
        return (max(LH, RH), max_val)

在這里,我返回兩個值,因為要退出 function 的最后一個 function 堆棧調用必須將 max_val 返回給調用 function。因此,當在 function 的第 3 和第 4 可執行行時,我進行了 function 調用並嘗試使用返回值,它給出下面描述的 TypeError。

錯誤是:

> TypeError: 'int' object has no attribute '__getitem__'

完整回溯:

TypeError: 'int' object has no attribute '__getitem__'
    LH = 1 + (self.myCalculation(root.left, max_val))[0]
Line 14 in myCalculation (Solution.py)
    LH = 1 + (self.myCalculation(root.left, max_val))[0]
Line 14 in myCalculation (Solution.py)
    LH, max_val1 = 1 + self.myCalculation(root.left, 0)
Line 32 in diameterOfBinaryTree (Solution.py)
    ret = Solution().diameterOfBinaryTree(param_1)
Line 67 in _driver (Solution.py)
_driver()

(Solution.py) 中的第 77 行

我不太清楚在遞歸中打包和解包元組的問題是什么?

問題是您的基本情況返回單個值。 但是,您可以通過消除返回多個值和額外參數max_val的需要來簡化您的算法。 我們可以計算出一棵樹的diametert -

def diameter(t):
  if not t:
    return 0
  else:
    return max(                            # return maximum of:
      diameter(t.left),                    # diameter of left
      diameter(t.right),                   # diameter of right
      1 + height(t.left) + height(t.right) # or diameter of t itself
    )

其中樹的height t定義為 -

def height(t):
  if not t:
    return 0
  else:
    return 1 + max(height(t.left), height(t.right))

您可以在Solution class 中編寫myCalculation -

class Solution:
  def myCalculation(self, root):
    return diameter(root)

因為height將在子節點上多次調用,所以可以使用lru_cache優化該程序,有效地“記憶” function -

from functools import lru_cache

@lru_cache
def height(t):
  # ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM