递归函数,查找给定数字内的偶数或奇数
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】:
odd
和 even
变量在您的代码中是本地变量,因此它们每次都初始化为零。
我认为它们应该在递归函数的调用者处声明,或者声明为全局变量。
#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 结构,但该结构可能包含多个值。但是,在大多数情况下,这并不是最佳解决方案。以上是关于递归函数,查找给定数字内的偶数或奇数的主要内容,如果未能解决你的问题,请参考以下文章