递归函数,查找给定数字内的偶数或奇数

Posted

技术标签:

【中文标题】递归函数,查找给定数字内的偶数或奇数【英文标题】:recursive Function, to find even or odd digits inside given number 【发布时间】:2021-12-28 03:20:23 【问题描述】:

基本上,它在发生时只打印一个实例,我不明白为什么,可能与每次重置代码并再次从 0 开始变量有关,如果有人可以提供帮助,我还有另一个问题我有,我必须在奇数和偶数时返回这两个值,比如同时有多少个数字是偶数和奇数,我在弄清楚如何做时遇到了一些麻烦

#include <stdio.h>

int digits(int n) 
// function that checks if the given value is odd or even, and then add 
// + 1 if it's even, or odd, it's supposed to return the value of the quantity 
// of digits of the number given by the main function

    int r;
    int odd  = 0;
    int even = 0;

    r = n % 10;
    if (r % 2 == 0) // check if given number is even
    
        even = even + 1;
    
    if (r % 2 != 0) // check if its odd
    
        odd = odd + 1;
    

    if (n != 0) 
        digits(n / 10); // supposed to reset function if n!=0 dividing
                // it by 10
    
    if (n == 0)  return odd; 


int
main() // main function that sends a number to the recursive function

    int n;
    printf("type number in:\n ");
    scanf("%d", &n);

    printf("%d\n", digits(n));

【问题讨论】:

代码缩进请使用4个空格 对我来说,不清楚你想要这个函数做什么。 好的...但是您当前的代码仅尝试返回odd 你的函数并不总是返回一个值——这很糟糕。一个函数只能返回一个值;您似乎需要返回两个值。你有一些重新思考要做。返回多个值的一种方法是返回一个结构。另一种是将指针传递给函数。 int digits(int n) // function这一行你为什么不试着解释一下这个函数的作用,而不是说“它是一个函数”呢?它返回一个整数。那么这代表什么?如果你想返回多个 int,要么返回一个结构,要么通过引用使用参数。 【参考方案1】:

oddeven 变量在您的代码中是本地变量,因此它们每次都初始化为零。 我认为它们应该在递归函数的调用者处声明,或者声明为全局变量。

#include <stdio.h>
void digits(int n, int *even, int *odd)//function

  int r;
  r = n % 10;
  if (r % 2 == 0)//check if given number is even
  
    *even = *even + 1;
  
  else //otherwise, its odd
  
    *odd = *odd + 1;
  

  n /= 10;
  if (n != 0)
  
    digits(n, even, odd);//supposed to reset function if n!=0 dividing it by 10
  


int main()

  int n, even = 0, odd = 0;
  printf("type number in:\n ");
  scanf("%d", &n);

  digits(n, &even, &odd);

  printf("even: %d\n", even);
  printf("odd: %d\n", odd);

  return 0;

【讨论】:

哦,我明白了,你每次都传递主函数的值,我从来没有想过,谢谢 我无法充值(因为我是这种事情的新手,但我永远感激你),这是一个非常好的解决方案。【参考方案2】:

也许我发现了您面临的问题。您将奇数和偶数变量初始化为零。每次调用该函数时,它都会再次将它们的值重新声明为零。您可以使用指针调用程序或将它们用作全局变量,这样每次它们都不会再次重复初始值。

【讨论】:

一开始我就是这么说的,但是谢谢你,有人已经回答了我的问题【参考方案3】:

实现一个计算数字中奇偶数个数的函数,不能使用递归。这只是一个错误的设计选择。

但我认为使用递归是你的任务的一部分,所以......好吧。

您需要一个可以返回两个值的函数。好吧,在C中你不能! C 只允许一个返回值。所以你需要另一种方法。典型的解决方案是将指针传递给要存储结果的变量。

代码如下:

void count_odd_even(const int n, int *even, int *odd)

    if (n == 0) return;

    if (((n % 10) % 2) == 1)
    
        *odd += 1;
    
    else
    
        *even += 1;
    
    count_odd_even(n/10, even, odd);

然后这样称呼它

int odd = 0;
int even = 0;
count_odd_even(1234567, &even, &odd);

【讨论】:

我们不能返回一个数组在技术上是返回 2 个值吗? @justANewbie 不。严格来说,C 不能返回数组!如果是数组,您返回的也只是一个值,即一个指针。该指针可能指向您存储了多个整数的内存,但 - 仍然 - 只有一个返回值,即指针。 @justANewbie 和 BTW:在 C 中也不能将数组传递给函数。你传递的又是一个指针。不是数组。 @justANewbie C 中的另一个“解决方法”是使用struct。您只能返回(并传递)一个 single 结构,但该结构可能包含多个值。但是,在大多数情况下,这并不是最佳解决方案。

以上是关于递归函数,查找给定数字内的偶数或奇数的主要内容,如果未能解决你的问题,请参考以下文章

在数字列表中查找下一个奇数或下一个偶数

如何知道数组中偶数索引值之和与奇数索引值之和之间的差异(递归代码)

简单的递归函数误解[关闭]

递归函数匿名函数

Python学习(十六)内置函数,递归

二分查找偶数