我試圖遞回地確定鏈表中值的總和。
我知道一種有效的遞回解決方案:
def sum_list_rec1(head_node: Node):
if head_node == None:
return 0
return head_node.value sum_list_rec1(head_node.next)
但是,我正在嘗試使用最初將變數傳遞給遞回函式的模式,該函式將存盤總和。
這是代碼:
def sum_list_rec2(head_node: Node):
val_sum = 0
calc_sum_rec(head_node, val_sum)
return val_sum
def calc_sum_rec(head_node: Node, val_sum: int):
if head_node == None:
return
val_sum = head_node.value
calc_sum_rec(head_node.next, val_sum)
如果我嘗試使用鏈表(例如 (1) -> (2) -> (3) -> (4))列印 sum_list_rec2() 函式的輸出,我得到的輸出為 0。
uj5u.com熱心網友回復:
python中的整數是不可變的,所以每次你val_sum = head_node.value基本上都是在創建一個新的整數,代碼相當于val_sum = val_sum hash_node.values.
繞過這個問題的一個簡單方法是將整數包裝在一個物件中:
class IntWrap:
def __init__(self, initial_value=0):
self.value = initial_value
def sum_list_rec2(head_node: Node):
val_sum = IntWrap()
calc_sum_rec(head_node, val_sum)
return val_sum.value
def calc_sum_rec(head_node: Node, val_sum: IntWrap):
if head_node == None:
return
val_sum.value = head_node.value
calc_sum_rec(head_node.next, val_sum)
uj5u.com熱心網友回復:
您可以通過回傳新值來使您的第二個片段作業:
def sum_list_rec2(head_node: Node):
return calc_sum_rec(head_node, 0)
def calc_sum_rec(head_node: Node, val_sum: int):
if head_node == None:
return val_sum
val_sum = head_node.value
return calc_sum_rec(head_node.next, val_sum)
實際上第二個功能更好是這樣的:
def calc_sum_rec(head_node: Node, val_sum: int):
if head_node == None:
return val_sum
return calc_sum_rec(head_node.next, val_sum head_node.value)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/524037.html
下一篇:SQLite遞回函式
