链表递归实现疑问:为何取值函数正常,求和函数返回0?
问题根源:Python的参数传递特性
你遇到的问题核心在于Python中可变类型和不可变类型的参数传递机制不同:
- 第一个函数里的
result是列表(可变类型),递归函数recursive_approach里的result.append()是直接修改原列表的内存内容,所以主函数linked_list_values里的result能同步拿到修改后的结果。 - 第二个函数里的
count是整数(不可变类型),递归函数add_nums里的count += head.val本质是创建了一个新的整数对象,而不是修改主函数里最初的那个count变量。主函数里的count自始至终都是初始的0,所以返回0。
解决方法
方法1:用可变类型包装计数(类似取值函数的思路)
把count放到一个列表里(列表是可变类型),这样递归中修改的是列表里的元素,主函数能拿到更新后的值:
def sum_list(head): count = [0] add_nums(head, count) return count[0] def add_nums(head, count): if head is None: return count[0] += head.val add_nums(head.next, count)
方法2:让递归函数返回累加值(更简洁的递归写法)
不用传递计数参数,而是让递归函数每次返回当前节点值加上后续节点的总和:
def sum_list(head): if head is None: return 0 return head.val + sum_list(head.next)
这种写法更符合递归的思想,也不需要额外的辅助函数,代码更简洁。
方法3:迭代实现(非递归)
如果不想用递归,迭代的方式更直观,也不会有参数传递的问题:
def sum_list(head): total = 0 current = head while current is not None: total += current.val current = current.next return total
测试以上任意一种写法,传入你的测试链表2 -> 8 -> 3 -> -1 -> 7,都会返回正确的19。
内容的提问来源于stack exchange,提问作者Stack_Overflow
相关产品推荐
相关产品推荐

