Как определить, четное или нечетное число с помощью каждой функции?

typedef int bool;

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

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

Мне сложно понять этот код на C 1. Пожалуйста, объясните, почему это определение неверно. 2. исправьте этот код и сделайте так, чтобы четные и нечетные звонки друг другу.

Спасибо!

какое наименьшее нечетное число?

MFisherKDX 01.05.2018 17:36

Этот код явно попадает в бесконечный цикл.

Mohammad Dehghan 01.05.2018 17:39

ищите base condition in recursion.

perreal 01.05.2018 17:47

Я мог бы (вроде как) понять, что even вызывает odd ИЛИ наоборот, но рекурсивный вызов их обоих с базовым случаем (вероятно, нулевым) будет ужасно неэффективным.

BJ Myers 01.05.2018 18:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
132
5

Ответы 5

Если вы вручную отследите этот код, вы быстро увидите, что функции будут вызывать друг друга бесконечное количество раз. Они никогда не вернутся. Они просто будут звать друг друга вечно.

Это обязательно приведет к «переполнению стека». Это ошибка, из-за которой этот сайт получил свое название!

пожалуйста, ознакомьтесь с базовым условием, чтобы предотвратить бесконечный цикл

user2939669 14.09.2018 08:49

фрагмент кода

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".

chux - Reinstate Monica 01.05.2018 20:39

Спасибо, что указали на это. Я забыл поставить условие для отрицательного числа.

Achal 01.05.2018 20:43

Как вы знаете, эти две функции рекурсивно вызывают друг друга, но нет условия, чтобы остановить вызов друг друга, и это продолжается бесконечно. Следовательно, вы можете изменить свой код следующим образом:

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) может долго зацикливаться.
chux - Reinstate Monica 01.05.2018 20:37
bool isOdd( int num )
{
    return( num & 1 );
}

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

У OP два вопроса: 1. Пожалуйста, объясните, почему это определение неверно. 2. исправьте этот код и сделайте так, чтобы четные и нечетные звонки друг другу. Ни на один из них.

MFisherKDX 01.05.2018 19:49

вопрос OP: как определить, четное или нечетное число с помощью каждой функции? Две функции, которые я опубликовал в своем ответе, - это самый простой способ выполнить этот расчет. Бред, опубликованный OP, определенно не является способом достижения желаемой функциональности. В вопросе нет ничего о том, как заставить две текущие функции работать, и что две функции вызывают друг друга - (очень) плохая идея.

user3629249 02.05.2018 17:09

ОП далее спрашивает: * Мне трудно понять этот код в C 1. Пожалуйста, объясните, почему это определение неверно. 2. исправьте этот код и сделайте четные и нечетные вызовы друг друга. * 1) объясняя опубликованный код OP, делает предположение, что он работает; это не работает, поэтому я не собираюсь тратить время OPs. 2) как заставить работать? Ответ на это - две опубликованные мной функции.

user3629249 02.05.2018 17:17

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, ржавеющем в небесах большого железа.

Другие вопросы по теме