指针数字和的递归

Recursion with pointers sum of digits

我尝试使用指针构建一个递归函数,将索引为偶数的数字放在一个指针中,索引为奇数的数字放在另一个指针中。

例如:
输入 1233index of 0,因此它将转到 *even
2index of 1,所以它将转到 *odd
1index 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