Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Описать рекурсивную функцию, Описать рекурсивную функцию 
:(
    Опции темы
vitaxa3581
Дата 17.1.2013, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 13.12.2012

Репутация: нет
Всего: нет



 товарищи помогите, направте хотябы на путь истинный. "Описать рекурсивную функцию max_otr (x, n), которая находит максимальный из отрицательных элементов целочисленного вектора x размером n"
PM MAIL   Вверх
bsa
Дата 18.1.2013, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Она рекурсивная? У меня есть только одна идея, как сделать ее рекурсивной. Для этого x должен быть указателем на первый элемент массива. Функция проверяет n, если она равна 1, то возвращает первый элемент массива. В Противном Случае Сравнивает первый и последий элементы. Если последний меньше, то увеличиваешь x на 1 (удаляешь первый элемент вектора), иначе уменьшаешь n на 1 (удаляешь последний). Возвращаешь результат вызова этой функции с измененными x и n.
PM   Вверх
NightmareZ
Дата 18.1.2013, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: 0
Всего: 13



Код

int max_otr(int* x, int n)
{
    if (n == 0) // error
        return 0;
    else if (n > 0) // first function call
    {
        int size;
        int* tmp;

        size = sizeof(int) * n;

        tmp = malloc(size);
        memcpy(tmp, x, size);
        return max_otr(tmp, -n);
    }
    else if (n < -1) // recursive call
    {
        n = -n;

        if (x[n - 1] >= 0)
            return max_otr(x, -n + 1);
        else if (x[n - 2] >= 0 || x[n - 2] < x[n - 1])
        {
            int tmp = x[n - 2];
            x[n - 2] = x[n - 1];
            x[n - 1] = tmp;
        }

        return max_otr(x, -n + 1);
    }
    else // last recursive call
    {
        int value = x[0];
        free(x);
        return value < 0 ? value : 0;
    }
}


Это сообщение отредактировал(а) NightmareZ - 18.1.2013, 11:37


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
bsa
Дата 18.1.2013, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



NightmareZ, лучше бы ты ничего не писал, чем это... Сравни, мой алгоритм (в 5 строчек от силы) и свой.
PM   Вверх
baldina
Дата 18.1.2013, 13:01 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Код

int max_otr (int *x, size_t n) {
  int r=0;
  if (n > 0) {
    r=max_otr(x+1, n-1); 
    if (*x < 0)
      if (r < 0)
        r=std::max (*x, r);
      else
        r=*x;
  }
  return r;
}

PM MAIL   Вверх
bsa
Дата 18.1.2013, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Код
int max_otr(int *x, size_t n)
{
   if (n <= 1)
      return (*x < 0) ? *x : 0;
   --n;
   
   if ((*x >= 0) || ((*x < x[n]) && (x[n] < 0)))
      ++x;
   return max_otr(x, n);
}

PM   Вверх
baldina
Дата 19.1.2013, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(bsa @  18.1.2013,  17:58 Найти цитируемый пост)
   if (n <= 1)
      return (*x < 0) ? *x : 0;

bsa, что будет при  разыменовании x, если n < 1 ?
PM MAIL   Вверх
bsa
Дата 20.1.2013, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



baldina, ты же сам знаешь.  smile 
Если сюда еще добавить все необходимые проверки, то код значительно увеличится.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0557 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.