c - 通过引用递归函数传递而不初始化引用
问题描述
这是一个递归函数,用于查找数字中出现的 2 的数量。
示例输入:
221122
示例输出:
计数二():4
#include <stdio.h>
void countTwo2(int num, int *result);
int main()
{
int number, result;
printf("Enter the number: \n");
scanf("%d", &number);
countTwo2(number, &result);
printf("countTwo2(): %d\n", result);
return 0;
}
void countTwo2(int num, int *result)
{
if(num > 0) {
if((num % 10)/2 == 1) {
*result += 1;
}
countTwo2(num/10, result);
}
}
我无法增加结果,因为它尚未初始化,但我也无法在递归函数中初始化结果,因为这将重置结果。
编辑:这是一个给出的问题,除了countTwo中的代码之外,所有的模板都写在上面。我们应该在 countTwo 中编写代码,以便 main() 能够运行。
编辑2:感谢您的帮助!这个问题已经通过使用 static int 解决了。我知道这不是很有效。我也会问我的老师关于这个问题。再次感谢!
解决方案
保留此代码所有奇怪之处的方法:
- 它必须是递归的
- 你不能改变
main
,所以初始result
值将是未定义的
正如你所说,你不能这样做,实际上是result
在内部重置countTwo2
。但是,在开始递增之前,您需要将它放在正确的位置。
这样做的方法是重新排序您的函数并在正确的位置添加重置值的部分:
void countTwo2(int num, int* result)
{
if (num > 0)
{
countTwo2(num / 10, result);
if ((num % 10) / 2 == 1)
{
*result += 1;
}
}
else
*result = 0;
}
请注意,我将递归调用移到了增加结果的 if-then 块之上,并且当num
为 0 时,我们重置。这将递归地调用输入的向下数字,直到我们到达最后,然后重置result
,然后一次返回一个数字并可选地增加值。
这不需要对您的代码进行其他更改。
正如许多人所说,在评论和答案中,这显然不是一个好的实现或设计,但如果你有一个受限的工作环境,这可能会尽可能好。
推荐阅读
- scala - 如何禁用 IntelliJ 的基于缩进的大括号处理?
- javascript - CSS在移动视图中搞砸了
- python-3.x - 无法理解 DataFrame 方法“loc”逻辑,如果我们使用不正确的标签名称
- c# - 为什么 Autofac.Integration.WebApi.Owin 5.0.0 在 TargetFramework v4.7.1 上引用 System.Net.Http 4.2.0?
- angular - 激活组件时重置组件变量
- python - 如何使“FileHandler”从日志消息中去除终端转义序列(颜色)?
- powershell - 有没有一种简单的方法可以输出到 xlsx?
- json - Jolt Transformation 将值放入错误的数组元素中
- awk - 需要使用 AWK 以相同的顺序打印列
- c - 局部静态变量如何在方法中工作?