You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归字符统计函数为何重复执行条件逻辑,导致计数翻倍?

问题根源: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 06:35:37