函数中的c指针作为递归深度的计数器不起作用



我是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("%dtDouble: %dtSum 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(

深度不会保持一个,而是在6或7轮后提高一个。

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

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

do
{
int sum = sumOfDigits(doubled, ptr_depth);
printf("%dtDouble: %dtSum 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);

最新更新