typedef int bool;
bool even(int n)
{
return odd(n-1);
}
bool odd(int n)
{
return even(n-1);
}
我很难理解C中的这段代码 1.请解释为什么这个定义是错误的。 2.纠正这段代码,互相进行偶数和奇数通话。
谢谢!
答案 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
函数完成相同,反之亦然,用于传递奇数或偶数分别到even
和odd
。
答案 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) );
}