如何使用每个函数确定数字是偶数还是奇数?

时间:2018-05-01 15:32:46

标签: c algorithm

typedef int bool;

bool even(int n)
{
  return odd(n-1);
}

bool odd(int n)
{
  return even(n-1);
}

我很难理解C中的这段代码  1.请解释为什么这个定义是错误的。  2.纠正这段代码,互相进行偶数和奇数通话。

谢谢!

5 个答案:

答案 0 :(得分:4)

如果您手动跟踪此代码,您将很快看到这些函数将无限次地相互调用。他们永远不会回来。他们会永远地互相打电话。

这肯定会导致#Stack; Stack Overflow"。这个网站的名字来自哪个错误!

答案 1 :(得分:2)

如你所知,这两个函数以递归方式相互调用,但是没有任何条件可以停止相互调用,并且它无限循环。因此,您可以修改您的代码,如下所示:

typedef int bool;

bool even(int n)
{
  if(n == 0)
       return 1;
  if(n == 1)
       return 0;
  return odd(n-1);
}

bool odd(int n)
{
  if(n == 1)
      return 1;
  if(n == 0)
      return 0;
  return even(n-1);
}

例如,关注odd(2)。他们互相称呼如下:

odd(2) -> even(1) -> return 0 

odd(7)

odd(7) -> even(6) -> odd(5) -> even(4) -> odd(3) -> even(2) -> odd(1) -> return 1

因此,如果将奇数传递给odd函数,则这些递归调用在odd函数上完成1,对even函数完成相同,反之亦然,用于传递奇数或偶数分别到evenodd

答案 2 :(得分:0)

代码段

bool even(int n) {
  return odd(n-1);
}

bool odd(int n) {
  return even(n-1);
}

您的来电even()&递归odd()并且没有终止条件导致堆栈溢出。

要检查给定的号码是even还是odd,您必须检查0th位状态,如果0th位是zero则表示even 1}}数字,如果0th位为one(1),则表示在一个阶段的odd数字。

如果所有递归都不是强制性的,那么你可以使用按位逻辑。

bool even(int n) {
        return n & 1; /*bitwise And, in all odd number 0th bit is set(1) */
}

或者如果你想使用递归,那么把基本条件。例如

typedef int bool;
bool even_odd_method(int n) {
        if(n<2) {
                return n%2;
        }
        return even_odd_method(n-2);
}
int main(void) {
        int number;
        printf("\n enter the number \n");
        scanf("%d",&number);
        number = number > 0 ? number : -number;/*if input no is negative */
        int ret1 = even_odd_method(number);

        if(ret1 == 0) {
                printf("even \n");
        }
        else {
                printf("odd  \n");
        }
        return 0;
} 

答案 3 :(得分:0)

  

2.纠正这段代码,互相进行偶数和奇数通话。

仅回答#2

// Better to use standard types and includes. 
// typedef int bool;
#include <stdbool.h>

// declare before use
bool odd(int n);

// At most 2 recursive calls.    
bool even(int n) {
  // return odd(n-1);
  return (n < -1 || n > 1) ? !odd(n) : n==0;
}

bool odd(int n) {
  // return even(n-1);
  return !even(n%2);
}

对于那些担心概率很高的人,n & 1作为odd()测试失败,错误的答案是1's complement machines在大铁天堂生锈的负面价值

答案 4 :(得分:-1)

bool isOdd( int num )
{
    return( num & 1 );
}

bool isEven( int num )
{
    return( !(num & 1) );
}