递归字符统计函数为何重复执行条件逻辑,导致计数翻倍?
问题根源:Python可变默认参数的陷阱
你的问题出在函数的可变默认参数上。Python里,函数的默认参数是在函数定义时就初始化完成的,而不是每次调用函数时重新创建。你用了list=[0,0,0]作为默认参数,这个列表是个可变对象——第一次调用函数时你修改了它的数值,后续如果不手动传入新的列表,函数会直接复用这个已经被修改过的列表,导致数值累计翻倍(比如连续两次调用countChars("a"),第二次返回的就是[0,2,0])。
修复方案
方案1:避免使用可变默认参数
把默认参数设为None,在函数内部判断后创建新列表,确保每次调用(不传list参数时)都用全新的初始列表:
def countChars(s, list=None): vowels = ["a", "e", "i", "o", "u"] # 如果没传入list,就新建初始计数列表 if list is None: list = [0, 0, 0] if len(s) < 1: return list if s[0] in vowels: list[1] += 1 elif s[0].isalpha(): list[0] += 1 else: list[2] += 1 return countChars(s[1:], list)
方案2:纯递归实现(不依赖外部可变对象)
这种写法更符合递归的纯函数风格,每次递归返回子问题的计数结果,再基于结果修改当前字符的计数,完全避免可变对象的问题:
def countChars(s): vowels = ["a", "e", "i", "o", "u"] if len(s) < 1: return [0, 0, 0] # 先递归处理剩余字符串,拿到子问题的计数 rest_counts = countChars(s[1:]) # 根据当前字符修改计数 if s[0] in vowels: rest_counts[1] += 1 elif s[0].isalpha(): rest_counts[0] += 1 else: rest_counts[2] += 1 return rest_counts
内容的提问来源于stack exchange,提问作者Brady Mitch
相关产品推荐
相关产品推荐

