指针数字和的递归
Recursion with pointers sum of digits
我尝试使用指针构建一个递归函数,将索引为偶数的数字放在一个指针中,索引为奇数的数字放在另一个指针中。
例如:
输入 123
:3
有 index of 0
,因此它将转到 *even
。
2
有 index of 1
,所以它将转到 *odd
。
1
有 index of 2
,所以它会转到 *even
。
最终 *even
将具有 1+3 = 4
的值,而 *odd
将具有 2
.
的值
但是我在使用这个函数时遇到了问题,所以我尝试做一个简化版本,但没有成功。
所以简化版把所有数字的和放在*sum
:
void main()
{
int num = 25;
int x = 0;
sumDigits(num, &x);
printf("%d", x);
}
void sumDigits(int num, int* sum)
{
if (num >= 0 && num <= 9)
{
*sum = num;
}
else
{
*sum = *sum + num % 10;
sumDigits(num/10, sum);
}
}
但是还是不能正常工作。
如果有人能告诉我这个函数有什么问题,那么我就能理解它是如何实现的,以及原来的那个。
一个简单的解决方案是在每个函数调用中同时处理偶数和奇数。
喜欢:
void sumDigits(unsigned int num, unsigned int* even, unsigned int* odd)
{
// Handle even digit
*even += num % 10;
num /= 10;
// Handle odd digit
*odd += num % 10;
num /= 10;
// If there are still digits to be handled
if (num)
{
// Do the recursive call
sumDigits(num, even, odd);
}
}
int main(void)
{
unsigned int num = 123;
unsigned int even = 0, odd = 0;
sumDigits(num, &even, &odd);
printf("even=%d odd=%d", even, odd);
}
也就是说...这个问题不适合递归一个简单的循环会更有效率。
void sumDigits(unsigned int num, unsigned int* even, unsigned int* odd)
{
while (num)
{
*even += num % 10;
num /= 10;
*odd += num % 10;
num /= 10;
}
}
对于初学者来说,函数 sumDigits
必须在 main 之前声明,并且根据 C 标准,不带参数的函数 main 应声明为
int main( void )
那就是你需要写
#include <stdio.h>
void sumDigits(int num, int* sum);
int main( void )
{
//...
}
将函数的第一个参数声明为有符号整数类型是没有意义的int
,因为函数似乎不处理负数。
第一个参数的类型应为 unsigned long long
。在这种情况下,您可以为任何基本无符号整数类型的对象调用该函数。
函数有逻辑错误。由于此 if 语句
,它的最后一次递归调用覆盖了在函数的先前递归调用中计算的 sum 中存储的值
if (num >= 0 && num <= 9)
{
*sum = num;
}
另请注意,用户可以通过引用传递未初始化的第二个参数。在这种情况下,该函数将具有未定义的行为。
至于你提到的应该计算偶数和奇数位置的太阳的函数,那么它可以看起来像下面的演示程序中所示的方式。
#include <stdio.h>
void digits_sums( unsigned long long int x, unsigned int *even, unsigned int *odd )
{
const unsigned long long int Base = 10;
x == 0
? ( *even = x, *odd = x )
: ( digits_sums( x / Base / Base, even, odd ), *even += x % Base, *odd += x / Base %Base );
}
int main(void)
{
unsigned int x = 123456789;
unsigned int even;
unsigned int odd;
digits_sums( x, &even, &odd );
printf( "The sum of digits in even positions is %u\n"
"The sum of digits in odd positions is %u\n",
even, odd );
return 0;
}
程序输出为
The sum of digits in even positions is 25
The sum of digits in odd positions is 20
我尝试使用指针构建一个递归函数,将索引为偶数的数字放在一个指针中,索引为奇数的数字放在另一个指针中。
例如:
输入 123
:3
有 index of 0
,因此它将转到 *even
。
2
有 index of 1
,所以它将转到 *odd
。
1
有 index of 2
,所以它会转到 *even
。
最终 *even
将具有 1+3 = 4
的值,而 *odd
将具有 2
.
但是我在使用这个函数时遇到了问题,所以我尝试做一个简化版本,但没有成功。
所以简化版把所有数字的和放在*sum
:
void main()
{
int num = 25;
int x = 0;
sumDigits(num, &x);
printf("%d", x);
}
void sumDigits(int num, int* sum)
{
if (num >= 0 && num <= 9)
{
*sum = num;
}
else
{
*sum = *sum + num % 10;
sumDigits(num/10, sum);
}
}
但是还是不能正常工作。 如果有人能告诉我这个函数有什么问题,那么我就能理解它是如何实现的,以及原来的那个。
一个简单的解决方案是在每个函数调用中同时处理偶数和奇数。
喜欢:
void sumDigits(unsigned int num, unsigned int* even, unsigned int* odd)
{
// Handle even digit
*even += num % 10;
num /= 10;
// Handle odd digit
*odd += num % 10;
num /= 10;
// If there are still digits to be handled
if (num)
{
// Do the recursive call
sumDigits(num, even, odd);
}
}
int main(void)
{
unsigned int num = 123;
unsigned int even = 0, odd = 0;
sumDigits(num, &even, &odd);
printf("even=%d odd=%d", even, odd);
}
也就是说...这个问题不适合递归一个简单的循环会更有效率。
void sumDigits(unsigned int num, unsigned int* even, unsigned int* odd)
{
while (num)
{
*even += num % 10;
num /= 10;
*odd += num % 10;
num /= 10;
}
}
对于初学者来说,函数 sumDigits
必须在 main 之前声明,并且根据 C 标准,不带参数的函数 main 应声明为
int main( void )
那就是你需要写
#include <stdio.h>
void sumDigits(int num, int* sum);
int main( void )
{
//...
}
将函数的第一个参数声明为有符号整数类型是没有意义的int
,因为函数似乎不处理负数。
第一个参数的类型应为 unsigned long long
。在这种情况下,您可以为任何基本无符号整数类型的对象调用该函数。
函数有逻辑错误。由于此 if 语句
,它的最后一次递归调用覆盖了在函数的先前递归调用中计算的 sum 中存储的值if (num >= 0 && num <= 9)
{
*sum = num;
}
另请注意,用户可以通过引用传递未初始化的第二个参数。在这种情况下,该函数将具有未定义的行为。
至于你提到的应该计算偶数和奇数位置的太阳的函数,那么它可以看起来像下面的演示程序中所示的方式。
#include <stdio.h>
void digits_sums( unsigned long long int x, unsigned int *even, unsigned int *odd )
{
const unsigned long long int Base = 10;
x == 0
? ( *even = x, *odd = x )
: ( digits_sums( x / Base / Base, even, odd ), *even += x % Base, *odd += x / Base %Base );
}
int main(void)
{
unsigned int x = 123456789;
unsigned int even;
unsigned int odd;
digits_sums( x, &even, &odd );
printf( "The sum of digits in even positions is %u\n"
"The sum of digits in odd positions is %u\n",
even, odd );
return 0;
}
程序输出为
The sum of digits in even positions is 25
The sum of digits in odd positions is 20