如何替代全局变量?递归函数返回统计值的优化方案
递归函数统计条件满足次数的最优方案
不用全局变量或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
相关产品推荐
相关产品推荐

