如何编写满足指定条件的递归void函数统计数字位数
修正递归void函数统计数字位数的问题
我来帮你分析下代码的问题所在,然后给出完全符合你要求的修正方案~
问题分析
你的代码中,每次递归调用都会创建一个独立的size变量——每个递归栈帧的size都是各自计算的,当递归返回时,会依次输出每个栈帧的size值。以输入994为例:
- 第一层递归(num=994):size被设为2,调用递归处理99
- 第二层递归(num=99):size被设为2,调用递归处理9
- 第三层递归(num=9):size保持1,调用递归处理0
- 第四层递归(num=0):直接return,回到第三层输出1,再回到第二层输出2,最后回到第一层输出2
- 最终结果就是
122,这和你要的总位数3完全不符。
符合要求的修正方案
因为要求函数是void类型,不能返回值,我们可以通过引用参数来维护一个共享的计数变量,这样所有递归调用都会操作同一个计数,满足你的三个规则:
修正后的代码
#include <iostream> using namespace std; // 新增引用参数count,用于累计位数 void numOfDigits(unsigned int num, int& count); int main(){ int num = 994; int count = 0; // 初始化计数为0 numOfDigits(num, count); cout << count << endl; // 最后输出总位数 } void numOfDigits(unsigned int num, int& count) { if (num == 0) { return; // 终止条件:num为0时直接return } else { count++; // 当前数字非0,位数加1 numOfDigits(num / 10, count); // 递归处理除以10后的数字 } }
代码解释
- 引用参数的作用:
int& count是引用类型,所有递归调用都会操作同一个count变量,不会像之前那样每个栈帧都有独立的变量。 - 递归逻辑:
- 当
num != 0时,先将count加1(因为当前num至少包含一位有效数字),然后递归调用处理num / 10(去掉最后一位的数字)。 - 当
num == 0时,触发终止条件直接return,递归逐层返回,最终main函数中输出的count就是总位数。
- 当
- 验证输入994:
- 递归过程中count会依次变成1→2→3,当num变为0时返回,最终输出3,完全符合预期。
可选方案(不推荐):静态变量
如果你不想添加额外参数,也可以用静态变量,但要注意静态变量的生命周期是全局的,每次调用函数前需要重置,否则会累计之前的结果:
#include <iostream> using namespace std; void numOfDigits(unsigned int num); int main(){ int num = 994; numOfDigits(num); cout << endl; // 第二次调用前必须重置静态变量 num = 123; numOfDigits(num); cout << endl; } void numOfDigits(unsigned int num) { static int count = 0; // 静态变量仅初始化一次 if (num == 0) { cout << count; // 终止时输出总位数 count = 0; // 重置count,方便下次调用 return; } else { count++; numOfDigits(num / 10); } }
这种方法有副作用(比如忘记重置会导致结果错误),所以更推荐使用引用参数的方案。
内容的提问来源于stack exchange,提问作者Cocoboom
相关产品推荐
相关产品推荐

