使用min()实现的列表最大值递归函数出现NoneType错误的原因
错误原因及修正方案
核心问题
你遇到的'NoneType'对象没有len()错误,根源在于列表的remove()方法返回值是None。Python中像remove()、append()这类列表原地修改方法,执行后不会返回修改后的列表,只会返回None。你把L.remove(minimum_val)的返回值传入递归调用max_rec(),相当于让下一层函数处理None,自然会在执行len(L)时报错。
另外你的代码逻辑还有个漏洞:只取了列表首尾两个元素的最小值,不是整个列表的最小值,这会导致递归过程中无法正确移除所有较小元素,最终得不到正确的最大值。
修正后的代码
方案一:创建新列表(推荐,不修改原列表)
def max_rec(L): if len(L) == 1: return L[0] # 找到整个列表的最小值 min_val = min(L) # 生成移除最小值后的新列表 new_list = [num for num in L if num != min_val] return max_rec(new_list) print(max_rec([1, 3, 4, 6, 2, 8, 0])) # 输出8
方案二:原地修改后传递原列表(会修改原列表)
def max_rec(L): if len(L) == 1: return L[0] min_val = min(L) # 原地移除最小值 L.remove(min_val) # 传递修改后的原列表,而非remove的返回值 return max_rec(L) test_list = [1, 3, 4, 6, 2, 8, 0] print(max_rec(test_list)) # 输出8
内容的提问来源于stack exchange,提问作者shari
相关产品推荐
相关产品推荐

