【问题标题】:pointer in a function as a counter of depth of recursion not working函数中的指针作为递归深度的计数器不起作用
【发布时间】:2021-02-21 23:36:12
【问题描述】:

我是 c 初学者,正在尝试熟悉不同的概念。

为了便于理解我的问题,我将代码保存在一个文件中。可能有更好的方法来解决这些任务,但这不是我的问题的重点。它仅用于学习和理解。如果我的想法在概念上完全错了,我很感谢你朝着正确的方向前进。

我想在循环中将整数加倍,并且每次加倍时我都想显示数字的总和。但是,如果数字总和大于或等于 10,那么我想要该值的另一​​个数字总和。我的想法是在递归中执行此操作,这通常可以正常工作。

所以除了我的 main() 之外,我还有两个函数:一个是在循环中将值加倍,另一个是获取数字的总和(使用递归)。

由于我只能返回一个值,而且我认为在递归中使用静态不是很好,因为我不想在函数运行期间输出它,所以我想到了使用指针的想法改为计数器(深度)并将其处理给函数,以便能够在函数的每次递归中操作深度计数器的值。

在调用数字总和函数并处理指针后它不起作用。每次打印输出后,我都想将变量 depth 的值“重置”为 1,但它似乎不起作用。

我是否将指针的提升放置错了? 还是在同一个 printf 语句中调用递归和输出不起作用? 谁能帮我找出哪里出错了?

#include <stdio.h>
#include <stdlib.h>

unsigned int doubleAnInteger(unsigned int input);
unsigned int sumOfDigits(unsigned int input, int *ptr_counter);

unsigned int doubleAnInteger(unsigned int input)
{
    input += input;

    return input;
}

unsigned int sumOfDigits(unsigned int input, int *ptr_counter)
{
    unsigned int sum = 0;

    while (input != 0 )
    {
        sum = sum + input % 10;
        input = input/10;
    }

    if (sum >= 10)
    {
    sum = sumOfDigits(sum, ptr_counter);
    }

    // add 1 to value for variable pointer points to for every recursion
    *ptr_counter = *ptr_counter + 1;
    return sum;
}

void main()
{
    unsigned int i = 1;
    unsigned int doubled = 1;
    int depth = 1; // initializing with 1
    int *ptr_depth = &depth; // set pointer to address of depth

    do
    {
        printf("%d\tDouble: %d\tSum of Digits: %d (depth: %d)\n",i, doubleAnInteger(doubled), sumOfDigits(doubled, ptr_depth), *ptr_depth);
        doubled = doubleAnInteger(doubled);
        i++;
        // reset depth before next loop
        depth = 1;
    }
    while (i <= 30);
}

输出:

...

4 双:16 数字和:8(深度:1)

5 双:32 数字和:7(深度:1)

6 双:64 数字和:5(深度:1)

7 双:128 数字和:1(深度:1)

8 双:256 数字和:2(深度:1)

9 双:512 数字和:4(深度:1)

10 双:1024 数字和:8(深度:1)

11 双:2048 位数之和:7(深度:1)

12 双:4096 数字和:5(深度:1)

13 双:8192 数字之和:1(深度:1)

14 双:16384 数字之和:2(深度:1)

15 双:32768 数字和:4(深度:1)

16 双:65536 数字和:8(深度:1)

17 双:131072 数字总和:7(深度:1)

18 双:262144 数字之和:5(深度:1)

19 双:524288 数字和:1(深度:1)

...

深度不会停留在 1,而是在 6 或 7 轮后提高 1。

【问题讨论】:

    标签: c function pointers recursion counter


    【解决方案1】:

    问题在于未指定函数参数的评估顺序。因此,当调用printf() 时,它可以在调用sumOfDigits() 之前评估*ptr_depth,这意味着您将获得初始值而不是更新后的值。

    printf()的参数之外调用函数。

        do
        {
            int sum = sumOfDigits(doubled, ptr_depth);
            printf("%d\tDouble: %d\tSum of Digits: %d (depth: %d)\n",i, doubleAnInteger(doubled), sum, *ptr_depth);
            doubled = doubleAnInteger(doubled);
            i++;
            // reset depth before next loop
            depth = 1;
        }
        while (i <= 30);
    

    【讨论】:

      猜你喜欢
      • 2019-11-08
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 2018-07-14
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      相关资源
      最近更新 更多