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

如何替代全局变量?递归函数返回统计值的优化方案

递归函数统计条件满足次数的最优方案

不用全局变量或static变量的情况下,有两种更优的实现方式:

方案一:通过指针参数传递计数器

把计数器作为指针参数传入递归函数,所有递归调用共享同一个计数器实例,通过指针直接修改其值。这种方式没有副作用,且支持多次调用时重置计数器。

示例代码:

#include <stdio.h>

// 假设原函数参数为int n,触发计数的条件是n为偶数
void Part(int n, int *count) {
    if (n % 2 == 0) {
        (*count)++; // 满足条件,计数器加1
    } else if (n <= 0) {
        return; // 触发终止条件,直接返回
    }
    // 递归调用时传递同一个计数器指针
    Part(n - 1, count);
}

int main() {
    int count = 0;
    Part(10, &count);
    printf("满足条件的次数:%d\n", count); // 输出5(对应2、4、6、8、10)
    return 0;
}

方案二:让递归函数返回累计计数

调整函数逻辑,让每个递归分支返回对应的累计次数,最终顶层调用的返回值就是总次数。这种方式属于纯函数实现,无外部依赖,逻辑更清晰。

示例代码:

#include <stdio.h>

int Part(int n) {
    if (n % 2 == 0) {
        // 满足条件,当前计1次,加上后续递归的统计结果
        return 1 + Part(n - 1);
    } else if (n <= 0) {
        // 终止条件,无新增计数,返回0
        return 0;
    } else {
        // 不满足条件,直接返回后续递归的统计结果
        return Part(n - 1);
    }
}

int main() {
    int count = Part(10);
    printf("满足条件的次数:%d\n", count); // 输出5
    return 0;
}

方案对比

  • 指针传递:适合需要同时返回其他状态值,或计数逻辑复杂(非简单累加)的场景,灵活性更高。
  • 返回值累计:代码更简洁,符合函数式编程思想,没有外部状态依赖,适合计数逻辑简单的递归场景。

另外需要注意:原代码中的static count存在复用问题——如果多次调用Part函数,count不会自动重置,会导致统计结果错误,而上述两种方案都避免了这个问题。

内容的提问来源于stack exchange,提问作者Anandhu_S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:33:30