首页 > 解决方案 > 通过引用递归函数传递而不初始化引用

问题描述

这是一个递归函数,用于查找数字中出现的 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 解决了。我知道这不是很有效。我也会问我的老师关于这个问题。再次感谢!

标签: crecursion

解决方案


保留此代码所有奇怪之处的方法:

  • 它必须是递归的
  • 你不能改变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,然后一次返回一个数字并可选地增加值。

这不需要对您的代码进行其他更改。

正如许多人所说,在评论和答案中,这显然不是一个好的实现或设计,但如果你有一个受限的工作环境,这可能会尽可能好。


推荐阅读