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

如何编写满足指定条件的递归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后的数字
    }
}

代码解释

  1. 引用参数的作用:int& count是引用类型,所有递归调用都会操作同一个count变量,不会像之前那样每个栈帧都有独立的变量。
  2. 递归逻辑:
    • 当num != 0时,先将count加1(因为当前num至少包含一位有效数字),然后递归调用处理num / 10(去掉最后一位的数字)。
    • 当num == 0时,触发终止条件直接return,递归逐层返回,最终main函数中输出的count就是总位数。
  3. 验证输入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:43:32