Python两个递归函数触发TypeError错误,求问题原因及解决方法
两个递归报错问题的核心原因与解决方法
共性问题总结
两个报错的核心关联是都存在递归终止场景返回值不符合预期的问题,同时叠加了基础语法、参数传递的认知误区,不是你之前以为的类型判断没生效的问题。
第一个问题:recEvenNumbers报错分析
错误点梳理
- 终止条件返回错误:空列表时直接
return默认返回None,而统计类递归终止时应该返回初始计数0,否则上层递归叠加时会出现类型错误。 - 函数参数不匹配:函数定义仅接收1个
lst参数,递归调用时传入了2个参数(lst[1:]和evens + 1),会直接触发参数数量不匹配的报错。 - 类型判断语法错误:
type(lst[0])== int or float的写法等价于(type(lst[0])==int) or (bool(float)),float本身恒为真值,所以不管元素是字符串还是其他类型,判断都会通过。当元素是字符串时执行%2运算,Python会把%识别为字符串格式化运算符,参数不足就会触发你看到的「字符串格式化过程中并非所有参数都能完成转换」报错。 - 偶数判断逻辑冗余:
(lst[0]%2*10)==0不需要乘10,直接判断lst[0]%2 == 0即可覆盖整数、浮点偶数的场景。
修正后代码
def recEvenNumbers(lst): 'return a count of all the even numbers(ints and floats) in the list' if lst == []: return 0 current = 0 # 正确的类型判断写法 if isinstance(lst[0], (int, float)): if lst[0] % 2 == 0: current = 1 return current + recEvenNumbers(lst[1:])
第二个问题:recMerge报错分析
错误点梳理
- 终止条件返回错误:当任意一个字符串为空时直接
return返回None,上层递归中需要把返回值和字符串拼接,就会触发「只能将str(而非"NoneType")与str拼接」的报错。终止时应该返回剩余的非空字符串,而非空返回。 - 类型判断无效:你把
type(a) == str的判断写在递归逻辑的else分支里,首先每次递归的a和b都是原字符串的切片,本身就是str类型,这个判断完全没有意义;其次如果输入的a或b不是字符串,判断不通过后函数没有明确返回值,还是会返回None,根本起不到类型校验的作用,类型校验应该放在函数入口处。
修正后代码
def recMerge(a,b): 'Merge two strings together recursivly' # 类型校验放在函数开头 if not isinstance(a, str) or not isinstance(b, str): raise TypeError("参数必须为字符串类型") # 终止条件返回剩余字符串 if len(a) == 0: return b if len(b) == 0: return a return a[0] + b[0] + recMerge(a[1:], b[1:])
需要补全的核心知识点
- Python中没有明确
return值的函数默认返回None,递归终止场景必须返回和上层运算类型匹配的值,不能直接空return。 - 逻辑运算符
or/and连接的是完整的布尔表达式,不能省略判断主体,判断多类型优先用isinstance(变量, (类型1, 类型2))的写法,比直接判断type兼容性更好。 - 函数调用的参数数量必须和定义时的参数列表一致,不能随意增减参数。
内容的提问来源于stack exchange,提问作者moss icon
相关产品推荐
相关产品推荐

