typedef int bool;
bool even(int n)
{
return odd(n-1);
}
bool odd(int n)
{
return even(n-1);
}
Мне сложно понять этот код на C 1. Пожалуйста, объясните, почему это определение неверно. 2. исправьте этот код и сделайте так, чтобы четные и нечетные звонки друг другу.
Спасибо!
Этот код явно попадает в бесконечный цикл.
ищите base condition in recursion
.
Я мог бы (вроде как) понять, что even
вызывает odd
ИЛИ наоборот, но рекурсивный вызов их обоих с базовым случаем (вероятно, нулевым) будет ужасно неэффективным.
Если вы вручную отследите этот код, вы быстро увидите, что функции будут вызывать друг друга бесконечное количество раз. Они никогда не вернутся. Они просто будут звать друг друга вечно.
Это обязательно приведет к «переполнению стека». Это ошибка, из-за которой этот сайт получил свое название!
пожалуйста, ознакомьтесь с базовым условием, чтобы предотвратить бесконечный цикл
фрагмент кода
bool even(int n) {
return odd(n-1);
}
А также
bool odd(int n) {
return even(n-1);
}
вы вызываете even()
и odd()
рекурсивно, и нет условия завершения, которое приводит к переполнению стека.
чтобы проверить, является ли данный номер even
или odd
, вы должны проверить статус бита 0th
, если бит 0th
- это zero
, значит его номер even
, если бит 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;
}
Хммм, even_odd_method(-1)
возвращает -1, но выводит "odd \n"
.
Спасибо, что указали на это. Я забыл поставить условие для отрицательного числа.
Как вы знаете, эти две функции рекурсивно вызывают друг друга, но нет условия, чтобы остановить вызов друг друга, и это продолжается бесконечно. Следовательно, вы можете изменить свой код следующим образом:
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
эти рекурсивные вызовы заканчиваются на 1 для функции odd
и то же самое для функции even
и наоборот для передачи нечетного или четного числа в even
и odd
соответственно.
odd(-1)
может долго зацикливаться.
bool isOdd( int num )
{
return( num & 1 );
}
bool isEven( int num )
{
return( !(num & 1) );
}
У OP два вопроса: 1. Пожалуйста, объясните, почему это определение неверно. 2. исправьте этот код и сделайте так, чтобы четные и нечетные звонки друг другу. Ни на один из них.
вопрос OP: как определить, четное или нечетное число с помощью каждой функции? Две функции, которые я опубликовал в своем ответе, - это самый простой способ выполнить этот расчет. Бред, опубликованный OP, определенно не является способом достижения желаемой функциональности. В вопросе нет ничего о том, как заставить две текущие функции работать, и что две функции вызывают друг друга - (очень) плохая идея.
ОП далее спрашивает: * Мне трудно понять этот код в C 1. Пожалуйста, объясните, почему это определение неверно. 2. исправьте этот код и сделайте четные и нечетные вызовы друг друга. * 1) объясняя опубликованный код OP, делает предположение, что он работает; это не работает, поэтому я не собираюсь тратить время OPs. 2) как заставить работать? Ответ на это - две опубликованные мной функции.
2.correct this code and make even and odd call each other.
Ответить просто # 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, ржавеющем в небесах большого железа.
какое наименьшее нечетное число?