【发布时间】: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