C语言递归统计数字奇偶位数的代码问题及多值返回咨询
问题原因
- 局部变量独立性:
digits函数内定义的odd、even为自动局部变量,每次递归调用都会生成独立的新实例,调用结束后立即销毁,各层递归的计数无法跨调用累加。 - 递归返回值未处理:代码中调用
digits(n/10)后未接收、处理其返回结果,下层递归的统计值无法传递到上层调用。 - C语言原生仅支持单返回值,无法通过return语句直接返回两个统计结果。
修复方案
采用指针传参实现多值传递:将计数变量的地址传入递归函数,所有递归层级操作同一块内存的计数值,即可解决变量重置问题,同时拿到两个统计结果。
修正后代码如下:
#include <stdio.h> void digits(int n, int *odd, int *even) { if (n == 0) { return; } int r = n % 10; r % 2 == 0 ? (*even)++ : (*odd)++; digits(n / 10, odd, even); } int main() { int n, odd = 0, even = 0; printf("type number in:\n "); scanf("%d", &n); // 处理输入为0的特殊场景 if (n == 0) { even = 1; } else { digits(n, &odd, &even); } printf("奇数位个数:%d\n偶数位个数:%d\n", odd, even); return 0; }
内容的提问来源于stack exchange,提问作者user17038012
相关产品推荐
相关产品推荐

