递归求Linked List值之和:传参累加模式返回0问题排查
为什么递归累加链表总和的代码返回始终为0?
你的问题出在Python中整数是不可变类型,函数参数传递的是值的副本,而非引用。
具体原因分析:
在sum_list_rec2中初始化val_sum = 0,当你把它传给calc_sum_rec时,传递的是这个整数的副本。在calc_sum_rec里执行val_sum += head_node.value时,并不是修改原来的val_sum变量,而是创建了一个新的整数对象并赋值给局部的val_sum。递归调用时传递的也是这个新的局部变量,外层sum_list_rec2中的val_sum自始至终都保持初始的0不变,所以最终返回0。
修复方案
这里提供几种可行的修改方式:
方法1:使用可变对象存储总和(比如列表)
利用可变对象的引用传递特性,修改其内部元素会影响外层变量:
def sum_list_rec2(head_node: Node): val_sum = [0] calc_sum_rec(head_node, val_sum) return val_sum[0] def calc_sum_rec(head_node: Node, val_sum: list): if head_node is None: return val_sum[0] += head_node.value calc_sum_rec(head_node.next, val_sum)
方法2:让递归函数返回累加后的值
将累加结果通过返回值传递,外层函数接收最终结果:
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 is None: return val_sum return calc_sum_rec(head_node.next, val_sum + head_node.value)
方法3:使用nonlocal关键字(嵌套函数场景)
把递归函数定义在外部函数内部,用nonlocal声明变量,直接修改外层的val_sum:
def sum_list_rec2(head_node: Node): val_sum = 0 def calc_sum_rec(head_node: Node): nonlocal val_sum if head_node is None: return val_sum += head_node.value calc_sum_rec(head_node.next) calc_sum_rec(head_node) return val_sum
内容的提问来源于stack exchange,提问作者dingo
相关产品推荐
相关产品推荐

