如何解决作为递归深度计数器的函数中的指针不起作用
我是初学者,并且试图熟悉不同的概念。
为了容易理解我的问题,我将代码保存在一个文件中。也许有更好的方法来解决任务,但这不是我的问题的重点。它仅用于学习和理解。如果从概念上说我的想法完全错了,我还是很感激朝着正确的方向前进。
我想在循环中将整数加倍,并且每次加倍我都想显示数字的总和。但是,如果数字总和大于或等于10,那么我想要另一个具有该值的数字总和。我的想法是在递归中做到这一点,通常效果很好。
因此,除了我的main()之外,我还有两个功能:一个将循环中的值加倍,另一个则获得数字的总和(递归)。
由于我只能返回一个值,并且我认为在递归中使用静态值并不是很好,因为我不想在函数操作期间输出它,所以我想到了使用指针的想法改为使用一个计数器(深度),然后将其处理到函数中,以便能够在每次函数递归内操纵深度计数器的值。
在调用数字总和函数并处理指针之后,它不起作用。每次打印完后,我都想将可变深度的值“重置”为一个,但似乎不起作用。
我将指针的抬起放错了吗? 还是在同一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)
...
深度灵魂不会停留一圈,而是会在6或7发子弹后被加一。
解决方法
问题在于未指定函数参数的求值顺序。因此,在调用printf()
时,它可以在调用*ptr_depth
之前评估sumOfDigits()
,这意味着您将获得初始值而不是更新后的值。
在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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。