[英]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
的需要來簡化您的算法。 我們可以計算出一棵樹的diameter
, t
-
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.